aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore36
-rw-r--r--AMSB.txt404
-rw-r--r--CHANGES.txt19
-rw-r--r--Makefile96
-rw-r--r--README.txt58
-rw-r--r--TODO9
-rw-r--r--a8cat.1177
-rw-r--r--a8cat.c207
-rw-r--r--a8cat.rst102
-rwxr-xr-xa8diff56
-rw-r--r--a8diff.1118
-rw-r--r--a8diff.rst50
-rw-r--r--a8eol.124
-rw-r--r--a8eol.rst4
-rwxr-xr-xa8utf8172
-rw-r--r--a8utf8.1118
-rw-r--r--a8utf8.rst57
-rw-r--r--a8xd.1272
-rw-r--r--a8xd.c400
-rw-r--r--a8xd.rst187
-rwxr-xr-xabas2html109
-rw-r--r--abas2html.1172
-rw-r--r--abas2html.rst90
-rw-r--r--amsb.7600
-rw-r--r--amsb.rst13
-rw-r--r--amsb40.rst31
-rw-r--r--amsb40.txt668
-rw-r--r--amsb_content.rst406
-rw-r--r--amsbtok.h161
-rw-r--r--aplus_tokens.c179
-rw-r--r--aplus_tokens.h5
-rw-r--r--atables.c396
-rw-r--r--atables.h3
-rw-r--r--atascii.726
-rw-r--r--atascii.c157
-rw-r--r--atascii.h44
-rw-r--r--atascii.rst4
-rw-r--r--atr2xfd.120
-rw-r--r--atrsize.120
-rw-r--r--axe.120
-rw-r--r--bas.c467
-rw-r--r--bas.h252
-rw-r--r--bas2aplus.1211
-rw-r--r--bas2aplus.c272
-rw-r--r--bas2aplus.rst143
-rw-r--r--bcdfp.c74
-rw-r--r--bcdfp.h4
-rw-r--r--blob2c.120
-rw-r--r--blob2xex.120
-rw-r--r--bxe_tokens.c19
-rw-r--r--bxe_tokens.h2
-rw-r--r--bxl_tokens.c64
-rw-r--r--bxl_tokens.h5
-rw-r--r--cart2xex.125
-rw-r--r--cart2xex.rst5
-rwxr-xr-xcolorize-amsb284
-rw-r--r--colorize-amsb.1100
-rw-r--r--colorize-amsb.rst39
-rw-r--r--cxrefbas.1194
-rw-r--r--cxrefbas.c74
-rw-r--r--cxrefbas.rst106
-rw-r--r--dasm2atasm.120
-rwxr-xr-xdiffbas56
-rw-r--r--diffbas.1132
-rw-r--r--diffbas.rst57
-rw-r--r--dumpbas.1244
-rw-r--r--dumpbas.c310
-rw-r--r--dumpbas.rst145
-rw-r--r--fauxtari.7346
-rw-r--r--fauxtari.rst175
-rw-r--r--fenders.120
-rw-r--r--fendersdbl.dasm9
-rw-r--r--fonts/FauxtariScalableMono.ttfbin0 -> 57484 bytes
-rw-r--r--fonts/Makefile2
-rw-r--r--fonts/char0.rawbin0 -> 8 bytes
-rw-r--r--fonts/dupglyphs.pl42
-rw-r--r--fonts/fauxtari-16.bdf9893
-rw-r--r--fonts/fauxtari-16.psfbin0 -> 18030 bytes
-rw-r--r--fonts/fauxtari-16.txt4796
-rw-r--r--fonts/fauxtari-24.bdf13325
-rw-r--r--fonts/fauxtari-24.psfbin0 -> 38510 bytes
-rw-r--r--fonts/fauxtari-24.txt5331
-rw-r--r--fonts/fauxtari-8.bdf6461
-rw-r--r--fonts/fauxtari-8.psfbin0 -> 5742 bytes
-rw-r--r--fonts/fauxtari-8.txt4261
-rw-r--r--fonts/fixbdf.pl41
-rw-r--r--fonts/mkpsf.pl1358
-rw-r--r--fonts/sorttxtfont.pl33
-rw-r--r--genopts.rst11
-rw-r--r--install-fonts.sh69
-rw-r--r--int_disk_tokens.c94
-rw-r--r--int_disk_tokens.h5
-rw-r--r--int_tokens.c189
-rw-r--r--int_tokens.h5
-rw-r--r--jindroush/Makefile14
-rw-r--r--jindroush/README.txt7
-rw-r--r--jindroush/acvt/Makefile4
-rw-r--r--jindroush/adir/Makefile4
-rw-r--r--jindroush/chkbas/basic_xe.h6
-rw-r--r--jindroush/chkbas/basic_xl.h6
-rw-r--r--jindroush/chkbas/chkbas.cpp2
-rw-r--r--jindroush/man/chkbas.124
-rw-r--r--jindroush/man/chkbas.rst14
-rw-r--r--linetab.c199
-rw-r--r--linetab.h23
-rw-r--r--listamsb.1377
-rw-r--r--listamsb.c1010
-rw-r--r--listamsb.rst313
-rw-r--r--listbas.1519
-rw-r--r--listbas.c1234
-rw-r--r--listbas.rst417
-rw-r--r--manftr.rst44
-rw-r--r--manhdr5.rst7
-rw-r--r--mkatables.pl161
-rw-r--r--ossintbas.7582
-rw-r--r--ossintbas.rst14
-rw-r--r--ossintbas_content.rst319
-rw-r--r--protbas.1151
-rw-r--r--protbas.c196
-rw-r--r--protbas.rst76
-rw-r--r--renumbas.1216
-rw-r--r--renumbas.c150
-rw-r--r--renumbas.rst138
-rw-r--r--rom2cart.120
-rw-r--r--tokens.c135
-rw-r--r--tokens.h4
-rw-r--r--turbo_tokens.c82
-rw-r--r--turbo_tokens.h5
-rw-r--r--unmac65.120
-rw-r--r--unmac65.c4
-rw-r--r--unmac65.xexbin0 -> 13899 bytes
-rw-r--r--unprotbas.1205
-rw-r--r--unprotbas.c528
-rw-r--r--unprotbas.rst168
-rw-r--r--ver.rst2
-rw-r--r--vxrefbas.1154
-rw-r--r--vxrefbas.c167
-rw-r--r--vxrefbas.rst80
-rw-r--r--whichbas.1299
-rw-r--r--whichbas.c1271
-rw-r--r--whichbas.h19
-rw-r--r--whichbas.rst215
-rw-r--r--wtable.c140
-rw-r--r--wtable.h2
-rw-r--r--xex.520
-rw-r--r--xex1to2.120
-rw-r--r--xexamine.120
-rw-r--r--xexcat.120
-rw-r--r--xexsplit.120
-rw-r--r--xfd2atr.120
150 files changed, 64540 insertions, 827 deletions
diff --git a/.gitignore b/.gitignore
index a03f602..5914a60 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,20 @@
+bas2aplus
+listamsb
+whichbas
+equates.m65
+fendersdbl.atasm
*.bas
*.BAS
+*.LST
+*.XEX
*.car
*.cart
*.rom
*.swp
*.syms
+*.a8s
1
+1.*
2
3
*.atr
@@ -13,22 +22,49 @@
*.old
*.bak
*.o
+a8cat
a8eol
+a8xd
atr2xfd
atrsize
axe
blob2c
cart2xex
+cart2rom
fenders
rom2cart
unmac65
+xex1to2
xexcat
xexsplit
xfd2atr
xexamine
blob2xex
+vxrefbas
+cxrefbas
+dumpbas
+listbas
+renumbas
+protbas
+unprotbas
+atrcheck
ksiders/atrdir
ksiders/atrextr
ksiders/makeatr
ksiders/sortatr
ksiders/unmakatr
+jindroush/acvt/acvt
+jindroush/acvt/switches.cpp
+jindroush/adir/adir
+jindroush/adir/switches.cpp
+jindroush/aext/aext
+jindroush/aext/switches.cpp
+jindroush/bas2boot/bas2boot
+jindroush/bas2boot/switches.cpp
+jindroush/chkbas/chkbas
+jindroush/chkbas/switches.cpp
+jindroush/chkexe/chkexe
+jindroush/chkexe/switches.cpp
+jindroush/chkrom/chkrom
+jindroush/chkrom/switches.cpp
+jindroush/lib/libjindroush.a
diff --git a/AMSB.txt b/AMSB.txt
new file mode 100644
index 0000000..f277e26
--- /dev/null
+++ b/AMSB.txt
@@ -0,0 +1,404 @@
+Atari Microsoft BASIC Notes
+---------------------------
+
+AMSB is actually a pretty cool BASIC for the Atari 8-bit. I never
+got the chance to use it 'back in the day' because it was expensive,
+required a floppy drive and at least 32K of RAM (my poor 400 had a
+tape drive for the first few years), and then later on, there was
+Turbo BASIC XL, which was cooler than AMSB, and also freeware.
+
+This file is a collection of notes I made to myself while developing
+listamsb. The information here might be useful (e.g. if you're trying
+to repair a damaged AMSB file) and hopefully is interesting. Enjoy!
+
+This file is part of the bw-atari8-utils source. You can get the
+latest version of the source from:
+
+https://slackware.uk/~urchlay/repos/bw-atari8-tools
+
+...which you can either view with a web browser or use with the 'git
+clone' command.
+
+ -- B. Watson <urchlay@slackware.uk>
+
+
+Tokenized file format
+---------------------
+
+File begins with a 3-byte header:
+
+offset | purpose
+-------+-------------------------------------------------------
+ 0 | 0 for a normal program, 1 for LOCKed (encrypted).
+ 1 | LSB, program length, not counting the 3-byte header...
+ 2 | MSB, " "
+
+The program length should always be the actual file size minus 3. If
+it's not, the file has either been truncated or had junk added to the
+end. In a LOCKed program, the program length bytes are not encrypted.
+
+After the header, the lines of code (encrypted, for LOCKed programs).
+Each line has a 4-byte header:
+
+offset | purpose
+-------+-------------------------------------------------------
+ 0 | LSB, address of the last byte of this line...
+ 1 | MSB, address ...which is ignored on LOAD!
+ 2 | LSB of line number
+ 3 | MSB " " "
+
+The rest of the line is the tokens, terminated by a $00 byte. The
+next 2 bytes after the $00 is the last-byte offset of the next line.
+
+The last "line" of the program has a $0000 offset, which indicates the
+end of the program. Since the actual last line ends with a $00, that
+means there will be three $00 bytes in a row as the last 3 bytes of
+the file. And that's the *only* place 3 $00's in a row will occur.
+
+Tokenization is "lightweight": there are no tokenized numerics,
+they're just stored as ASCII characters, as typed. There's no "string
+constant follows" token like there is in Atari BASIC (well, there is,
+it's just a double-quote, $22. There's no length byte). Variable names
+are not tokenized, either, they're just stored as-is (name in ASCII,
+including trailing $ for strings, etc). Numeric constants are just
+stored as ASCII digits, just as you typed them.
+
+In fact the only things that are tokenized are BASIC keywords:
+commands and functions... NOT including user functions defined
+with DEF (those are stored as just the ASCII function name, like
+variables).
+
+There are 2 sets of tokens. One set is single-byte, $80 and up.
+These are commands. The other set is functions, which are 2 bytes:
+$FF followed by the token number. See amsbtok.h in the source for the
+actual tokens.
+
+AMSB saves the end-of-line pointers, but it totally ignores them
+on LOAD. The SAVEd file format does *not* have a load address (as e.g.
+Commodore BASIC does), so there's no way to know the address of the
+start of the program (other than counting backwards from the next line,
+since its address is known). It's not just a constant either: it
+depends on what MEMLO was set to when the program was saved (which varies
+depending on what version of AMSB you have, what DOS you boot, whether
+or not you have the R: device driver loaded, etc etc).
+
+
+Redundant Tokens
+----------------
+
+There are two separate tokens each for PRINT and AT:
+
+token | text
+------+-----------------------
+ $ab | "PRINT "
+ $ac | "PRINT"
+ $df | "AT("
+ $e0 | "AT "
+
+When tokenizing a line, AMSB will actually use the $ab token if
+there's a space after PRINT (or ?), otherwise it will use the
+$ac token. These lines actually get tokenized differently:
+
+10 PRINT "HELLO"
+10 PRINT"HELLO"
+
+Same applies to the $df and $e0 AT tokens: if the user entered
+"AT(X,Y)", $df is used. Otherwise, with "AT (X,Y)", $e0 is used
+(followed by an ASCII left parenthesis).
+
+3 tokens include the opening parenthesis:
+
+token | text
+------+-----------------------
+ $d2 | "TAB("
+ $d6 | "SPC("
+ $df | "AT("
+
+Normally in AMSB, it's OK to leave a space between a function name
+and the left-paren. PEEK (123) and SIN (1) are both valid. However,
+for SPC and TAB, no space is allowed, because the ( is part of the
+token. AT would be the same way, except there's a separate token $e0
+that *includes* the space. Weird, huh? A side effect of this is
+that "SPC (10)" or "TAB (10)" won't be treated as a function call.
+Instead, the SPC or TAB is treated as a variable name. If you write:
+
+PRINT TAB (10);"HELLO"
+
+...it'll print " 0 HELLO" at the start of the line[*], instead of "HELLO"
+in the 10th column as you might have expected. It also means that AT,
+TAB, and SPC are valid variable names in AMSB, which is an exception
+to the rule that keywords can't be used as variable names (e.g. SIN=1
+or STRING$="HELLO" are invalid).
+
+[*] Unless you've assigned another value to TAB, of couse.
+
+
+Unused Tokens
+-------------
+
+If you look at the token list in amsbtok.h (or in a hex dump
+of the AMSB executable or cartridge image), you'll see a lot of
+double-quotes mixed in with the list. AMSB doesn't actually tokenize
+the " character (it's stored as $22, its ASCII value), so these seem
+to be placeholders, either because some tokens were deleted from the
+language during its development, or else they're intended for some
+future version of AMSB that never happened.
+
+The weird quote tokens are $99, $c8 to $d0, $d5, and $e7 to $ed. If
+you hexedit a program to replace a regular double-quote with one of
+these tokens, it will list as either "" or just one ", but it will
+cause a syntax error at runtime.
+
+
+LOADing Untokenized Files
+-------------------------
+
+If the first byte of the file is anything other than $00 or $01,
+AMSB's LOAD command reads it in as a text file (LISTed rather than
+SAVEd).
+
+When LOAD is reading a text file, if the last byte of the file isn't
+an ATASCII EOL ($9b), you'll get #136 ERROR. The program doesn't get
+deleted, but the last line of the file didn't get loaded. This could
+happen if a LISTed file somehow got truncated.
+
+While on the subject... the manual doesn't mention it, but if you LOAD
+a text file without line numbers, the code gets executed in direct
+mode during the load (like Atari BASIC's ENTER command does). This
+means you could write scripts (batch files) for AMSB... though you'd
+be better off using MERGE, rather than LOAD (MERGE is basically the
+same thing as Atari BASIC's ENTER).
+
+
+Program Length Header Mismatch
+------------------------------
+
+When AMSB's LOAD command executes, it reads the 3-byte header, then
+reads as many bytes as the header's program length says.
+
+If the header length is longer than the rest of the file, you get
+a #136 ERROR (aka Atari's EOF), and the partially loaded program is
+erased (basically it does a NEW).
+
+If the length is shorter than the program, it'll stop loading no
+matter how much more data is in the file. This means it can stop in
+the middle of a line. It also means, if there was already a program in
+memory that was longer than the program length, you get a "hybrid" mix
+of the new program followed by the remainder of the old one. This is
+because the three $00 bytes at the end of the program weren't read in.
+
+If the program length is correct for the actual program (so the three
+$00 bytes get read), but there's extra data appended to the file, AMSB
+will never read the extra data at all.
+
+
+String Limitations
+------------------
+
+String literals in AMSB cannot contain the | or ATASCII heart
+characters.
+
+AMSB uses | as a terminator for quoted strings, e.g. "STRING" will
+be tokenized as: "STRING|
+
+If you try to use a | in a quoted string, it gets turned into a double
+quote: "FOO|BAR" comes out as "FOO"BAR which is a syntax error!
+
+String variables can store | but only with e.g. CHR$(124) or reading
+from a file: it's string *literals* that don't allow it.
+
+The reason | is used for a terminating quote is to allow doubling up
+the quotes to embed them in a string:
+
+A$ = "HAS ""QUOTES"""
+PRINT A$ will print: HAS "QUOTES"
+
+At first I thought "no pipe characters in strings, WTF man?" but it's
+probably no worse than Atari BASIC's "no quotes in strings constants"
+rule. It *would* be nice if the AMSB manual actually documented the
+fact that | can't occur in a string constant. Not documenting it makes
+it a bug... and they have unused tokens in the $Fx range, I don't see
+why they had to use a printing character for this.
+
+You also can't put a heart (ATASCII character 0) in a string
+literal. It will be treated as the end of the line, as though you
+pressed Enter (and anything else on the line is ignored). This isn't
+documented in the manual, either.
+
+Like the | character, you can use CHR$(0) to store a heart in a string
+and it will work correctly.
+
+
+Line Number Range
+-----------------
+
+AMSB doesn't allow entering line numbers above 63999, but if a file
+is e.g. hex-edited to have a line number that's out of range, it will
+LIST and RUN just fine... except that it's impossible to GOTO or GOSUB
+to an out-of-range line. It will still execute if program flow falls
+into it.
+
+
+Differences Between Versions
+----------------------------
+
+The language is the same in AMSB versions 1 and 2. Tokenized files
+made by one version will LOAD and RUN in the other version.
+
+Version 1, the disk version, always has the full set of commands
+avaiable. Version 2, the cart, only has the full set if the extension
+disk is booted. The missing ones still get tokenized, but you get SN
+ERROR at runtime if you try to execute them. This doesn't affect the
+detokenizer at all. The missing commands:
+
+AUTO
+DEF (the string version; numeric is still present)
+NOTE
+RENUM
+TRON
+TROFF
+DEL
+USING
+STRING$ (function, not a command)
+
+RENUM only works in direct mode, not a program. Executing it
+gives a FUNCTION CALL ERROR.
+
+AUTO is (oddly) allowed in a program. Executing it exits the program
+and puts you back in the editor, in auto-numbering mode.
+
+It would seem weird to have POINT available but not NOTE... except
+that AMSB doesn't even *have* POINT. Instead, the disk addresses
+returned by NOTE are used with AT() in a PRINT statement. Not sure
+if AT() works without the extensions loaded, but it won't be useful
+anyway without NOTE.
+
+One other difference between versions 1 and 2: version 2 will LOAD and
+RUN the file D:AUTORUN.AMB at startup, if it exists.
+
+
+Colon Weirdness
+---------------
+
+AMSB allows comments to be started with the ! and ' characters (as
+well as the traditional REM). For the ! and ' variety, if they
+come at the end of a line after some code, you don't have to put a colon.
+Example:
+
+10 GRAPHICS 2+16 ! NO TEXT WINDOW
+
+However... in the tokenized format, there *is* a tokenized colon
+just before the tokenized ! or ' character. LIST doesn't display it.
+If you did put a colon:
+
+10 CLOSE #1:! WE'RE DONE WITH THE FILE
+
+...then there will be *two* colons in the tokenized file, and only
+one will be LISTed.
+
+The ELSE keyword works the same way. In this line:
+
+10 IF A THEN PRINT ELSE STOP
+
+...there is actually a : character just before the token for ELSE.
+
+Even weirder: you can put as many colons in a row as you like, and
+AMSB will treat it like single colon. This line of code is valid
+and runs correctly:
+
+10 PRINT "FOO"::::::PRINT "BAR"
+
+These colons are displayed normally in LIST output.
+
+
+Memory Usage
+------------
+
+On a 48K/64K Atari, FRE(0) for AMSB 1 with DOS booted (since you can't
+use it without) but no device drivers is 21020. MEMLO is awfully high
+($6a00).
+
+For AMSB 2 with DOS booted, but without the extensions loaded, FRE(0)
+is 24352. With extensions it's 20642 (even though the banner says 20644
+BYTES FREE).
+
+AMSB 2 without DOS gives you 29980, but how are you gonna load or save
+programs without DOS? Nobody wants to use cassette, especially not
+people who could afford to buy the AMSB II cartridge.
+
+
+LOCKed Programs
+---------------
+
+If you save a program with SAVE "filename" LOCK, it gets saved in an
+"encrypted" form. Loading a locked program disbles the LISTing or
+editing the program (you get LK ERROR if you try).
+
+The "encryption" is no better than ROT13. To encrypt, subtract each
+byte from 0x54 (in an 8-bit register, using twos complement). To
+decrypt, do the same. This is a reciprocal cipher, and you can think
+of it as the binary equivalent of ROT13.
+
+You can tell a LOCKed program because its first byte will be 1 instead
+of 0. The next 2 bytes (the program length) unencrypted. The rest of
+the file is encrypted with the lame scheme described above.
+
+When AMSB has a LOCKed program loaded into memory, it's *not* stored
+encrypted in RAM. It would be perfectly possible to write BASIC code
+using direct mode to write the tokenized program out to disk. The
+program starts at MEMLO and extends up to the first occurrence of
+three $00 bytes. The hardest part of this would be generating the
+header using only direct-mode BASIC statements (but it could be done).
+
+However... there's no need to do that. AMSB has a flag that tells it
+whether or not the currently-loaded program is LOCKed. You can just
+clear the flag:
+
+POKE 168,0
+
+Now AMSB won't consider the program LOCKed, and you can SAVE a regular
+copy of it (and LIST, edit, etc).
+
+
+Line Length Limit
+-----------------
+
+In the editor, after a POKE 82,0 (to set the left margin to 0), you
+can enter 120 characters (3 screen lines) on a logical line. If you
+enter a program line that way *without* a space after the line number,
+then LIST it, it will be 121 characters long, because AMSB will
+display a space after the line number.
+
+If you use a text editor (or write a program) to create an untokenized
+BASIC program, you can have a line of code that's 125 characters
+long. AMSB will accept it just fine, with LOAD. If a line is 126
+characters or longer, AMSB will silently ignore that line when
+LOADing.
+
+If you create a 125-character line (with a text editor) consisting
+only of a comment that begins with ! or ', without a space after the
+line number, LOAD it, then SAVE it, that line will be 129 bytes long
+in tokenized form. AMSB will LOAD it with no problems.
+
+If you hex-edit a SAVEd file to create a longer line, AMSB will
+accept that, too... up to 255 bytes. At 256 bytes, AMSB will lock
+up after LOAD.
+
+
+Crunching
+---------
+
+AMSB stores spaces in the tokenized program, just like other 8-bit
+MS BASICs do, but it requires you to put spaces between keywords and
+variables (unlike e.g. Commodore 64 BASIC). This seems to be because
+AMSB allows keywords inside of variable names: you can have a variable
+called LIFE (which contains the keyword IF) in AMSB, but you can't in
+C=64 BASIC (which gives a syntax error becase it sees "L IF E").
+
+This applies to numbers, too: POKE710,0 is a syntax error in
+AMSB. This is because POKE710 is actually a valid variable name: try
+POKE710=123 followed by PRINT POKE710.
+
+However. The spaces aren't needed when the program is RUN. It would be
+possible to remove all the spaces outside of strings or comments and
+the program would still work fine.
diff --git a/CHANGES.txt b/CHANGES.txt
new file mode 100644
index 0000000..17c581e
--- /dev/null
+++ b/CHANGES.txt
@@ -0,0 +1,19 @@
+This is just a list of the user-visible changes. The real log is the
+git commit log, of course.
+
+version 0.2.3 (not released yet):
+
+- OSS Integer BASIC is now supported in listbas.
+- new tool: abas2html.
+- add color syntax highlighting to listamsb.
+- add -k option to listamsb: keep comment-only lines when crunching.
+- convert AMSB.txt to a section 7 man page.
+- a8cat now uses correct ANSI code to disable inverse video.
+
+version 0.2.2:
+
+- Added this file, CHANGES.txt.
+- whichbas now detects LOCKed AMSB programs.
+- AMSB.txt is now installed in the doc dir with 'make install'.
+
+version 0.2.1: first release
diff --git a/Makefile b/Makefile
index d1bb32f..90f22c8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,4 @@
+# This Makefile requires GNU make.
# Install paths. DESTDIR is used for installing to an alternate location,
# for people making RPM/deb/tgz/etc packages.
@@ -9,6 +10,9 @@ MAN1DIR=$(MANDIR)/man1
MAN5DIR=$(MANDIR)/man5
MAN7DIR=$(MANDIR)/man7
DOCDIR=$(PREFIX)/share/doc/bw-atari8-tools
+PSFDIR=$(PREFIX)/share/kbd/consolefonts
+BDFDIR=$(PREFIX)/share/share/fonts/misc
+TTFDIR=$(PREFIX)/share/share/fonts/TTF
# Compiler stuff
COPT=-O2
@@ -16,17 +20,20 @@ CC=gcc
CFLAGS=-Wall $(COPT) -ansi -D_GNU_SOURCE -DVERSION=\"$(VERSION)\"
# BINS and SCRIPTS go in $BINDIR, DOCS go in $DOCDIR
-BINS=a8eol xfd2atr atr2xfd blob2c cart2xex fenders xexsplit xexcat atrsize rom2cart unmac65 axe blob2xex xexamine xex1to2 unprotbas
-SCRIPTS=dasm2atasm a8utf8
-MANS=a8eol.1 xfd2atr.1 atr2xfd.1 blob2c.1 cart2xex.1 fenders.1 xexsplit.1 xexcat.1 atrsize.1 rom2cart.1 unmac65.1 axe.1 dasm2atasm.1 a8utf8.1 blob2xex.1 xexamine.1 xex1to2.1 unprotbas.1
+BINS=a8eol atr2xfd atrsize axe blob2c blob2xex cart2xex cxrefbas dumpbas fenders protbas renumbas rom2cart unmac65 unprotbas vxrefbas xex1to2 xexamine xexcat xexsplit xfd2atr listbas a8cat a8xd whichbas bas2aplus listamsb
+SCRIPTS=dasm2atasm diffbas a8diff colorize-amsb abas2html
+MANS=a8eol.1 xfd2atr.1 atr2xfd.1 blob2c.1 cart2xex.1 fenders.1 xexsplit.1 xexcat.1 atrsize.1 rom2cart.1 unmac65.1 axe.1 dasm2atasm.1 blob2xex.1 xexamine.1 xex1to2.1 unprotbas.1 protbas.1 renumbas.1 dumpbas.1 vxrefbas.1 cxrefbas.1 listbas.1 a8cat.1 a8xd.1 whichbas.1 diffbas.1 a8diff.1 bas2aplus.1 listamsb.1 colorize-amsb.1 abas2html.1
MAN5S=xex.5
-MAN7S=atascii.7
-DOCS=README.txt equates.inc *.dasm LICENSE ksiders/atr.txt
+MAN7S=atascii.7 fauxtari.7 amsb.7 ossintbas.7
+DOCS=README.txt CHANGES.txt equates.inc *.dasm LICENSE ksiders/atr.txt
+PSFS=fonts/fauxtari-8.psf fonts/fauxtari-16.psf fonts/fauxtari-24.psf
+BDFS=fonts/fauxtari-8.bdf fonts/fauxtari-16.bdf fonts/fauxtari-24.bdf
+TTF=fonts/FauxtariScalableMono.ttf
SUBDIRS=ksiders jindroush
# All the programs share this version number...
-VERSION=0.2.1
+VERSION=0.2.2
# If your system doesn't support gzipped man pages, comment this out:
GZIP_MAN=y
@@ -47,10 +54,45 @@ RST2MAN=rst2man
# "make clean" and "make distclean" will not delete the 6502 object
# code (the *.bin files), but "make realclean" will.
-all: $(BINS) manpages symlinks subdirs
+all: $(BINS) manpages symlinks subdirs $(TTF) amsb40.txt
+
+atest: atest.c atascii.c atables.c wtable.c
+
+intbas: bas.o
+
+unprotbas: bas.o
+
+protbas: bas.o
+
+renumbas: bas.o bcdfp.o linetab.o
+
+dumpbas: bas.o
+
+whichbas: bas.o
+
+vxrefbas: bas.o
+
+cxrefbas: bas.o bcdfp.o linetab.o
+
+bas2aplus: bas.o
+
+listbas: listbas.c bas.o bcdfp.o tokens.o atables.o turbo_tokens.o aplus_tokens.o bxl_tokens.o bxe_tokens.o int_disk_tokens.o int_tokens.o
+ $(CC) $(CFLAGS) -o listbas listbas.c bas.o bcdfp.o tokens.o atables.o turbo_tokens.o aplus_tokens.o bxl_tokens.o bxe_tokens.o int_disk_tokens.o int_tokens.o -lm
+
+listamsb: listamsb.o atascii.o atables.o
+
+bas.o: bas.c bas.h
+
+wtable.o: wtable.c wtable.h
+
+atables.o: atables.c atables.h
+
+a8cat: a8cat.c atables.o wtable.o atascii.o
+
+a8xd: a8xd.c atables.o
subdirs:
- for dir in $(SUBDIRS); do make -C $$dir COPT=$(COPT); done
+ @for dir in $(SUBDIRS); do ${MAKE} --no-print-directory -C $$dir COPT="$(COPT)"; done
a8eol: a8eol.c
@@ -58,6 +100,9 @@ xfd2atr: xfd2atr.c
atr2xfd: atr2xfd.c
+atables.c: mkatables.pl
+ perl mkatables.pl > atables.c
+
# note to cross-compiler users: If you're building the *.bin targets,
# blob2c needs to be executable on the build host. It'd also be nice
# to build a blob2c for the target platform... Probably you can do
@@ -140,15 +185,30 @@ cart2rom: rom2cart
manpages: $(MANS) $(MAN5S) $(MAN7S)
-%.1: %.rst manhdr.rst manftr.rst
+%.1: %.rst manhdr.rst manftr.rst genopts.rst
$(RST2MAN) $< > $@
%.5: %.rst manhdr5.rst manftr.rst
$(RST2MAN) $< > $@
+amsb.7: amsb.rst manhdr7.rst manftr.rst amsb_content.rst
+
+ossintbas.7: ossintbas.rst manhdr7.rst manftr.rst ossintbas_content.rst
+
%.7: %.rst manhdr7.rst manftr.rst
$(RST2MAN) $< > $@
+fonts/fauxtari-8.bdf: fonts/mkpsf.pl
+ ( cd fonts && perl mkpsf.pl )
+
+$(TTF): fonts/fauxtari-8.bdf
+ bitmapfont2ttf --family-name "Fauxtari Scalable Mono" fonts/fauxtari-8.bdf $(TTF)
+
+# 40-column version of amsb.7, as plain text, for use an an Atari BBS.
+amsb40.txt: amsb_content.rst amsb40.rst
+ rst2man amsb40.rst > amsb40.7
+ LANG=C MANWIDTH=40 man --nj ./amsb40.7 > amsb40.txt
+
# "make clean" does NOT remove the .bin or _bin.[ch] files. This is
# for people who don't have either dasm or atasm installed.
# also, it doesn't remove the man pages. these are checked into git, even.
@@ -199,3 +259,21 @@ install-subdirs: subdirs
for dir in $(SUBDIRS); do \
make -C $$dir DESTDIR=$(DESTDIR) PREFIX=$(PREFIX) BINDIR=$(BINDIR) MAN1DIR=$(MAN1DIR) GZIP_MAN=$(GZIP_MAN) DOCDIR=$(DOCDIR) install; \
done
+
+install-fonts: all
+ sh install-fonts.sh "$(DESTDIR)" "$(BDFDIR)" "$(TTFDIR)"
+
+user-font: user-fonts
+
+user-fonts:
+ $(MAKE) install-fonts BDFDIR=$(HOME)/.fonts TTFDIR=$(HOME)/.fonts
+
+user-symlinks: all
+ SRC=$$( pwd ) ; \
+ mkdir -p ~/bin ; \
+ cd ~/bin && \
+ for i in $(BINS) $(SCRIPTS) \
+ ksiders/atrdir ksiders/atrextr ksiders/makeatr ksiders/sortatr ksiders/unmakatr \
+ jindroush/chkrom/chkrom jindroush/chkbas/chkbas jindroush/bas2boot/bas2boot \
+ jindroush/chkexe/chkexe jindroush/adir/adir jindroush/acvt/acvt jindroush/aext/aext \
+ ; do rm -f $$i; ln -sf $$SRC/$$i . ; done
diff --git a/README.txt b/README.txt
index 76003f8..edbac3c 100644
--- a/README.txt
+++ b/README.txt
@@ -2,13 +2,17 @@ This is a collection of Atari 8-bit related utilities I've written for
or ported to Linux. They should be usable as-is on other UNIX-like
systems, including Cygwin for MS-Windows.
+a8cat - Convert Atari 8-bit text to/from UTF-8 encoded Unicode or plain
+ text.
+
+a8diff - Show differences between two Atari ATASCII text files.
+
a8eol - Convert Atari 8-bit text files to/from UNIX / DOS / Mac Classic
text file format.
-a8utf8 - Convert Atari 8-bit text to UTF-8 encoded Unicode.
+a8xd - ATASCII and Unicode aware hex dump.
-axe - ATR/XFD Editor. Copy files into & out of ATR and XFD images,
- create blank ATR images, etc.
+abas2html - Convert tokenized Atari BASIC to lovely HTML, using aha.
atr2xfd - Convert an Atari 8-bit ATR disk image to a raw (XFD) image.
@@ -17,6 +21,11 @@ atrcheck - Check an Atari 8-bit ATR disk image for various types of problems.
atrsize - Change the size of an Atari 8-bit ATR disk image, or create
a blank ATR image.
+axe - ATR/XFD Editor. Copy files into & out of ATR and XFD images,
+ create blank ATR images, etc.
+
+bas2aplus - Convert Atari BASIC (and some BASIC XL/XE) programs to BASIC/A+.
+
blob2c - Create C source and header files from a binary file.
blob2xex - Create a XEX file from arbitrary data.
@@ -26,17 +35,36 @@ cart2rom - Convert an Atari800 CART image to a raw ROM image.
cart2xex - Convert an Atari 8-bit ROM cartridge image to a binary load
(XEX) file.
+cxrefbas - Code cross-reference for tokenized Atari 8-bit BASIC files.
+
dasm2atasm - Convert 6502 assembly in DASM syntax to ATASM (or MAC/65) format.
+diffbas - Show differences between two tokenized Atari 8-bit BASIC files.
+
+dumpbas - Formatted hexdump for tokenized Atari 8-bit BASIC files.
+
fenders - Install Fenders 3-sector loader in boot sectors of an ATR image.
+listamsb - Detokenize (LIST) Atari Microsoft BASIC programs.
+
+listbas - Detokenize (LIST) Atari 8-bit BASIC programs.
+
+protbas - LIST-protect Atari 8-bit BASIC programs.
+
+renumbas - Renumber Atari 8-bit BASIC programs.
+
rom2cart - Convert a raw Atari 8-bit cartridge ROM image to a CART
image for use with emulators such as Atari800.
unmac65 - Detokenize Atari 8-bit Mac/65 SAVEd files.
+vxrefbas - Variable cross-reference for tokenized Atari 8-bit BASIC files.
+
unprotbas - Unprotect LIST-protected BASIC programs.
+whichbas - Examine a BASIC program, decide whether it's Atari BASIC,
+ Turbo BASIC, BASIC XL, BASIC XE, or Atari Microsoft BASIC.
+
xex1to2 - Convert an Atari DOS 1.0 executable into a standard XEX file.
xexamine - Show information on XEX files.
@@ -48,19 +76,25 @@ xexsplit - Split a multi-segment Atari 8-bit executable (XEX) into
xfd2atr - Convert an Atari 8-bit XFD (raw) disk image to an ATR image.
-All are written in C, except a8utf8 and dasm2atasm which are written
-in Perl. All utilities have man pages.
+All are written in C, except dasm2atasm which is written in Perl and
+diffbas which is a shell script. All utilities have man pages.
+
+Also included:
+
+- "equates.inc", a 6502 assembly header file that defines the Atari 8-bit
+ system equates. It's meant to be used with either the DASM or ATASM 6502
+ cross assemblers.
-Also included is "equates.inc", a 6502 assembly header file that defines
-the Atari 8-bit system equates. It's meant to be used with either the
-DASM or ATASM 6502 cross assemblers.
+- Collections of utilities by Ken Siders and Jindrich Kubec. See the
+ README.txt files in the ksiders/ and jindroush/ directories for details.
-Also included: collections of utilities by Ken Siders and Jindrich
-Kubec. See the README.txt files in the ksiders/ and jindroush/
-directories for details.
+- X11 and Linux console fonts composed of glyphs taken from various versions
+ of the Atari XL/XE ROMs. The font family is "Fauxtari"; see fauxtari(7)
+ or fauxtari.rst for details.
To install, use the standard "make && make install" process. The default
-prefix for installation is /usr/local.
+prefix for installation is /usr/local. GNU make is required, so
+use "gmake" if you're on e.g. FreeBSD.
You may use "make install PREFIX=/somewhere/else" to install somewhere
other than /usr/local. Binaries will be installed to $PREFIX/bin, man
diff --git a/TODO b/TODO
index 848f39b..d76feb6 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,13 @@
for now:
+
+fauxtari:
+- Figure out why fauxtari doesn't show up in font-selections
+ dialogs in xfc4-terminal, gnome-terminal; also it doesn't
+ show up in "kitty +list-fonts" output.
+
+listbas:
+- A+/BXL/BXE indentation needs work (BXE seems OK).
+
These may need library (xex.c) changes:
xexcat: handle run/init addresses embedded in a segment longer than
2 bytes. Implemented in library, but not used by xexcat yet.
diff --git a/a8cat.1 b/a8cat.1
new file mode 100644
index 0000000..58e5252
--- /dev/null
+++ b/a8cat.1
@@ -0,0 +1,177 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "A8CAT" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+a8cat \- Convert Atari 8-bit text to UTF-8 encoded Unicode (and back).
+.SH SYNOPSIS
+.sp
+\fIa8cat\fP [\fB\-r\fP] [\fB\-i\fP] [\fB\-u\fP] [\fB\-t\fP] [\fIinfile\fP] [\fIinfile ...\fP]
+.SH DESCRIPTION
+.sp
+Convert Atari 8\-bit ATASCII or XL ICS (International Character
+Set) text to UTF\-8 encoded Unicode. Control graphics characters are
+replaced with their nearest Unicode equivalents (mostly from the Box
+Drawing block, or from the Basic Latin block with \fB\-i\fP option).
+.sp
+If no \fIinfile\fPs are given, input is read from standard input. Output always
+goes to standard output; to write to a file, use a command like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+a8cat atari.txt > converted.txt
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The output is UTF\-8 Unicode, without BOM, but possibly with
+ANSI/VT\-100 control sequences. It will display correctly in modern
+terminals that support Unicode and UTF\-8. If you get lots of "empty
+rectangle" characters, it means your font lacks the glyphs for the
+codepoints; try using the Deja Vu Sans and/or Symbola fonts.
+.sp
+If you want to pipe the output to a pager, \fBless \-MR\fP is
+recommended. It will display the inverse characters correctly.
+.sp
+It\(aqs even possible to edit the converted text and turn it back into
+ATASCII, if you\(aqre very careful. See the \fB\-r\fP option, below.
+.sp
+Inverse video (characters codes above \fB$80\fP) are translated using
+the ANSI/VT\-100 reverse video escape sequences. Exception: \fB$9B\fP
+(Atari EOL) is translated to \fB\en\fP (newline).
+.SH OPTIONS
+.INDENT 0.0
+.TP
+.B \-i
+Input uses Atari XL/XE International Character Set encoding, rather than
+ATASCII graphics.
+.TP
+.B \-u
+Use "underlining" for inverse video. Each inverse character is followed by
+a backspace, then a \fI_\fP character. When viewed in a pager such as \fBless\fP(1),
+this causes the characters to appear underlined. Output created with this
+option cannot be converted back to ATASCII with the \fB\-r\fP option.
+.TP
+.B \-t
+Text mode. Normally, everything but EOL (\fB$9B\fP) is converted to a
+Unicode graphics character. In text mode, ATASCII tabs, backspace,
+and bells are translated to the ASCII versions.
+.TP
+.B \-r
+Reverse conversion: Input is plain text, or UTF\-8 created by a previous
+run of \fBa8cat\fP; output is ATASCII (or XL ICS, with \fB\-i\fP). ASCII
+tabs, backspaces, and newlines will be coverted to the ATASCII
+equivalent. ASCII carriage returns will be silently ignored.
+.sp
+Only the UTF\-8 codepoints that correspond to ATASCII characters will
+be converted. If the \fB\-i\fP option was used to create the input, it
+must be used with \fB\-r\fP also.
+.sp
+\fBa8cat\fP will refuse to print ATASCII to a terminal. You must
+redirect or pipe the output.
+.TP
+.B \-m
+Magazine listing mode. Rather than Unicode graphics characters,
+ATASCII characters are printed in symbolic form, e.g. \fI{clear}\fP or
+\fI{ctrl\-A}\fP\&. The result is similar to type\-in listings in magazines
+like Antic, Analog, or Compute! Output created with this option
+cannot be converted back to ATASCII with the \fB\-r\fP option.
+.TP
+.B \-s
+Strip the inverse video bit (bit 7) from all characters except the
+EOL (\fB$9B\fP). Output created with this option can be converted
+back to ATASCII with the \fB\-r\fP option, but of course there won\(aqt
+be any inverse\-video characters in the result.
+.TP
+.B \-v
+Verbose operation.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \fB\-\-\fP
+End of options; the rest of the arguments are filenames. Use this if you\(aqre
+trying to work with files whose names begin with \fI\-\fP\&.
+.TP
+.B \fB\-h\fP, \fB\-\-help\fP
+Show built\-in help and exit.
+.TP
+.B \fB\-\-version\fP
+Show version number and exit.
+.UNINDENT
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/a8cat.c b/a8cat.c
new file mode 100644
index 0000000..92eae9f
--- /dev/null
+++ b/a8cat.c
@@ -0,0 +1,207 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <locale.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "atascii.h"
+#include "wtable.h"
+
+int reverse = 0, verbose = 0;
+
+atascii_ctx actx;
+
+const char *self;
+
+void set_self(const char *argv0) {
+ char *p;
+
+ self = argv0;
+ p = strrchr(self, '/');
+ if(p) self = p + 1;
+}
+
+void die(const char *msg) {
+ fprintf(stderr, "%s: %s\n", self, msg);
+ exit(1);
+}
+
+void print_help(void) {
+ printf("Usage: %s [-i] [-u] [file ...]\n", self);
+}
+
+FILE *open_input(const char *file) {
+ FILE *input;
+
+ if(file[0] == '-' && file[1] == 0) {
+ if(verbose)
+ fprintf(stderr, "%s: reading from standard input.\n", self);
+ if(freopen(NULL, "rb", stdin)) {
+ input = stdin;
+ } else {
+ perror("(standard input)");
+ return NULL;
+ }
+ } else if(!(input = fopen(file, "rb"))) {
+ perror(file);
+ return NULL;
+ }
+
+ if(verbose)
+ fprintf(stderr, "%s: reading from file '%s'.\n", self, file);
+
+ return input;
+}
+
+int handle_escape_seq(int inv, FILE *input, const char *file, int line) {
+ int count, c;
+ char buf[5] = { 0x1b, 0, 0, 0, 0 };
+
+ for(count = 1; count < 4; count++) {
+ c = fgetwc(input);
+ if(c == WEOF) break;
+ buf[count] = c; /* FIXME: might be a wide char! */
+ }
+
+ if(strcmp(atascii_inverse_on, buf) == 0) {
+ return 0x80;
+ } else if(strcmp(atascii_inverse_off, buf) == 0) {
+ return 0;
+ } else {
+ fprintf(stderr, "%s: warning: %s:%d: unrecognized ANSI escape sequence.\n", self, file, line);
+ fputs(buf, stdout);
+ return inv;
+ }
+}
+
+int a8revcat(const char *file) {
+ FILE *input;
+ int c, d, inv = 0, line = 1;
+
+ if( !(input = open_input(file)) )
+ return 1;
+
+ while( (c = fgetwc(input)) != WEOF ) {
+ if(c == 0x1b) {
+ inv = handle_escape_seq(inv, input, file, line);
+ } else if(c == '\r') {
+ continue; /* swallow carriage returns */
+ } else if(c == '\n') {
+ putchar(0x9b);
+ line++;
+ } else if(c == '\t') {
+ putchar(0x7f);
+ } else if(c == '\b' || c == 0x7f) {
+ putchar(0x7e);
+ } else if(c == '\a') {
+ putchar(0xfd);
+ } else if(c < 0x80) {
+ putchar(c | inv);
+ } else {
+ d = wchar2atascii(c, actx.flags & ATA_FLAG_ICS);
+ if(d == -1) {
+ fprintf(stderr, "%s: warning: %s:%d: unrecognized Unicode character %04x.\n", self, file, line, c);
+ } else {
+ putchar(d | inv);
+ }
+ }
+ }
+
+ if(verbose)
+ fprintf(stderr, "%s: %s: converted %d lines, closing file.\n", self, file, line - 1);
+
+ fclose(input);
+ return 0;
+}
+
+int a8cat(const char *file) {
+ FILE *input;
+ int c;
+ char converted[20];
+
+ if( !(input = open_input(file)) )
+ return 1;
+
+ while( (c = fgetc(input)) != EOF ) {
+ fputs(atascii_a2utf(&actx, c, converted), stdout);
+ }
+
+ /* gotta turn off inverse, so if there's another file after this one,
+ it doesn't start out being printed in inverse. */
+ fputs(atascii_a2utf(&actx, ATA_CHR_FINISH, converted), stdout);
+
+ if(verbose)
+ fprintf(stderr, "%s: %s: converted %d lines, closing file.\n", self, file, actx.lines - 1);
+
+ fclose(input);
+ return 0;
+}
+
+int main(int argc, char **argv) {
+ int opt, result = 0;
+ int mode = ATA_MODE_UTF8, flags = 0;
+
+ set_self(argv[0]);
+
+ if(argc > 1 && strcmp(argv[1], "--help") == 0) {
+ print_help();
+ exit(0);
+ }
+
+ if(argc > 1 && strcmp(argv[1], "--version") == 0) {
+ printf("%s %s\n", self, VERSION);
+ exit(0);
+ }
+
+ while( (opt = getopt(argc, argv, "ihurtmsv")) != -1) {
+ switch(opt) {
+ case 'i': flags |= ATA_FLAG_ICS; break;
+ case 'h': print_help(); exit(0); break;
+ case 'u': flags |= ATA_FLAG_UNDERLINE; break;
+ case 'r': reverse = 1; break;
+ case 't': flags |= ATA_FLAG_TEXTMODE; break;
+ case 'm': mode = ATA_MODE_MAGAZINE; break;
+ case 's': flags |= ATA_FLAG_STRIP_INVERSE; break;
+ case 'v': verbose = 1; break;
+ default: print_help(); exit(1); break;
+ }
+ }
+
+ atascii_context_init(&actx, mode, flags);
+
+ if(reverse) {
+ if(isatty(fileno(stdout)))
+ die("Refusing to write ATASCII to a terminal.");
+
+ /*
+ if(underline || textmode || stripinv || magazine) {
+ die("-t, -u, -m, -s options don't make sense with -r.\n");
+ }
+ */
+ /* the language_country part of the locale doesn't matter,
+ since we aren't doing localization. the encoding *has*
+ to be UTF-8. */
+ setlocale(LC_CTYPE, "en_US.UTF-8");
+ }
+
+ /*
+ if(magazine) {
+ if(ics || stripinv || underline) {
+ die("-i, -s, -u options don't make sense with -m.\n");
+ }
+ }
+ */
+
+ if(optind >= argc) {
+ result = (reverse ? a8revcat("-") : a8cat("-"));
+ } else {
+ while(optind < argc) {
+ result += (reverse ? a8revcat(argv[optind]) : a8cat(argv[optind]));
+ optind++;
+ }
+ }
+
+ exit(result);
+}
diff --git a/a8cat.rst b/a8cat.rst
new file mode 100644
index 0000000..3909391
--- /dev/null
+++ b/a8cat.rst
@@ -0,0 +1,102 @@
+=====
+a8cat
+=====
+
+-------------------------------------------------------------
+Convert Atari 8-bit text to UTF-8 encoded Unicode (and back).
+-------------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+*a8cat* [**-r**] [**-i**] [**-u**] [**-t**] [*infile*] [*infile ...*]
+
+DESCRIPTION
+===========
+
+Convert Atari 8-bit ATASCII or XL ICS (International Character
+Set) text to UTF-8 encoded Unicode. Control graphics characters are
+replaced with their nearest Unicode equivalents (mostly from the Box
+Drawing block, or from the Basic Latin block with **-i** option).
+
+If no *infile*\s are given, input is read from standard input. Output always
+goes to standard output; to write to a file, use a command like::
+
+ a8cat atari.txt > converted.txt
+
+The output is UTF-8 Unicode, without BOM, but possibly with
+ANSI/VT-100 control sequences. It will display correctly in modern
+terminals that support Unicode and UTF-8. If you get lots of "empty
+rectangle" characters, it means your font lacks the glyphs for the
+codepoints; try using the Deja Vu Sans and/or Symbola fonts.
+
+If you want to pipe the output to a pager, **less -MR** is
+recommended. It will display the inverse characters correctly.
+
+It's even possible to edit the converted text and turn it back into
+ATASCII, if you're very careful. See the **-r** option, below.
+
+Inverse video (characters codes above **$80**) are translated using
+the ANSI/VT-100 reverse video escape sequences. Exception: **$9B**
+(Atari EOL) is translated to **\\n** (newline).
+
+OPTIONS
+=======
+
+-i
+ Input uses Atari XL/XE International Character Set encoding, rather than
+ ATASCII graphics.
+
+-u
+ Use "underlining" for inverse video. Each inverse character is followed by
+ a backspace, then a *_* character. When viewed in a pager such as **less**\(1),
+ this causes the characters to appear underlined. Output created with this
+ option cannot be converted back to ATASCII with the **-r** option.
+
+-t
+ Text mode. Normally, everything but EOL (**$9B**) is converted to a
+ Unicode graphics character. In text mode, ATASCII tabs, backspace,
+ and bells are translated to the ASCII versions.
+
+-r
+ Reverse conversion: Input is plain text, or UTF-8 created by a previous
+ run of **a8cat**; output is ATASCII (or XL ICS, with **-i**). ASCII
+ tabs, backspaces, and newlines will be coverted to the ATASCII
+ equivalent. ASCII carriage returns will be silently ignored.
+
+ Only the UTF-8 codepoints that correspond to ATASCII characters will
+ be converted. If the **-i** option was used to create the input, it
+ must be used with **-r** also.
+
+ **a8cat** will refuse to print ATASCII to a terminal. You must
+ redirect or pipe the output.
+
+-m
+ Magazine listing mode. Rather than Unicode graphics characters,
+ ATASCII characters are printed in symbolic form, e.g. *{clear}* or
+ *{ctrl-A}*. The result is similar to type-in listings in magazines
+ like Antic, Analog, or Compute! Output created with this option
+ cannot be converted back to ATASCII with the **-r** option.
+
+-s
+ Strip the inverse video bit (bit 7) from all characters except the
+ EOL (**$9B**). Output created with this option can be converted
+ back to ATASCII with the **-r** option, but of course there won't
+ be any inverse-video characters in the result.
+
+-v
+ Verbose operation.
+
+**--**
+ End of options; the rest of the arguments are filenames. Use this if you're
+ trying to work with files whose names begin with *-*.
+
+**-h**, **--help**
+ Show built-in help and exit.
+
+**--version**
+ Show version number and exit.
+
+.. include:: manftr.rst
diff --git a/a8diff b/a8diff
new file mode 100755
index 0000000..38d4460
--- /dev/null
+++ b/a8diff
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+usage() {
+ cat <<EOF
+Usage: $( basename $0 ) [diff-opts] [-- a8cat-opts] file1 file2
+
+Diff two Atari ATASCII files, using a8cat(1) and diff(1).
+
+[diff-opts] is passed through as-is to diff.
+[a8cat-opts] is passed through as-is to a8cat.
+EOF
+ exit "$1"
+}
+
+cleanup() {
+ if [ "$dir" != "" ]; then
+ cd
+ rm -rf "$dir"
+ fi
+}
+
+if [ "$1" = "-h" -o "$1" = "--help" -o "$1" = "" ]; then
+ usage 0
+fi
+
+for i in "$@"; do
+ if [ -f "$i" ]; then
+ if [ "$file1" = "" ]; then
+ file1="$( realpath $i )"
+ base1="$( basename $i )".txt
+ elif [ "$file2" = "" ]; then
+ file2="$( realpath $i )"
+ base2="$( basename $i )".txt
+ else
+ usage 1
+ fi
+ elif [ "$i" = "--" ]; then
+ opts="a8catopts"
+ elif [ "$opts" = "a8catopts" ]; then
+ a8catopts="$a8catopts $i"
+ else
+ diffopts="$diffopts $i"
+ fi
+done
+
+dir="$( mktemp -d -t diffbas.XXXXXXXXXX )"
+[ -d "$dir" ]
+cd "$dir"
+trap cleanup EXIT
+set -e
+
+a8cat $a8catopts "$file1" > $base1
+a8cat $a8catopts "$file2" > $base2
+diff $diffopts $base1 $base2
+
+exit 0
diff --git a/a8diff.1 b/a8diff.1
new file mode 100644
index 0000000..fc4f378
--- /dev/null
+++ b/a8diff.1
@@ -0,0 +1,118 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "A8DIFF" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+a8diff \- Show differences between two Atari 8-bit ATASCII text files
+.SH SYNOPSIS
+.sp
+a8diff [\fIdiff\-options\fP] [\fB\-\-\fP \fIa8cat\-options\fP] \fIfile1\fP \fIfile2\fP
+.SH DESCRIPTION
+.sp
+\fBa8diff\fP shows the differences between two ATASCII text files,
+using \fBa8cat\fP(1) and \fBdiff\fP(1).
+.SH OPTIONS
+.sp
+\fBa8diff\fP takes no options of its own. It will pass options as\-is
+to both \fBa8cat\fP and \fBdiff\fP\&. Use \fB\-\-\fP to separate them: everything
+before \fB\-\-\fP is passed to \fBdiff\fP, and everything between \fB\-\-\fP and
+the first filename is passed to \fBa8cat\fP\&.
+.SH EXAMPLE
+.sp
+A.LST and B.LST were both created by the \fBLIST\fP command in BASIC.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+$ a8diff \-u A.LST B.LST
+
+\-\-\- A.LST.txt 2024\-07\-12 23:56:46.937965855 \-0400
++++ B.LST.txt 2024\-07\-12 23:56:46.938965854 \-0400
+@@ \-1,3 +1,4 @@
+ 10 ? "THIS LINE IS IN BOTH PROGRAMS."
+ 20 ? "THIS LINE IS ALSO IN BOTH."
++25 ? "THIS LINE ONLY IN B.LST!"
+ 30 END
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH EXIT STATUS
+.sp
+0 for success. On failure, the exit status is that of whichever command
+failed (\fBa8diff\fP or \fBdiff\fP).
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/a8diff.rst b/a8diff.rst
new file mode 100644
index 0000000..4273642
--- /dev/null
+++ b/a8diff.rst
@@ -0,0 +1,50 @@
+======
+a8diff
+======
+
+-----------------------------------------------------------
+Show differences between two Atari 8-bit ATASCII text files
+-----------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+a8diff [*diff-options*] [**--** *a8cat-options*] *file1* *file2*
+
+DESCRIPTION
+===========
+**a8diff** shows the differences between two ATASCII text files,
+using **a8cat**\(1) and **diff**\(1).
+
+OPTIONS
+=======
+**a8diff** takes no options of its own. It will pass options as-is
+to both **a8cat** and **diff**. Use **--** to separate them: everything
+before **--** is passed to **diff**, and everything between **--** and
+the first filename is passed to **a8cat**.
+
+EXAMPLE
+=======
+
+A.LST and B.LST were both created by the **LIST** command in BASIC.
+
+::
+
+ $ a8diff -u A.LST B.LST
+
+ --- A.LST.txt 2024-07-12 23:56:46.937965855 -0400
+ +++ B.LST.txt 2024-07-12 23:56:46.938965854 -0400
+ @@ -1,3 +1,4 @@
+ 10 ? "THIS LINE IS IN BOTH PROGRAMS."
+ 20 ? "THIS LINE IS ALSO IN BOTH."
+ +25 ? "THIS LINE ONLY IN B.LST!"
+ 30 END
+
+EXIT STATUS
+===========
+0 for success. On failure, the exit status is that of whichever command
+failed (**a8diff** or **diff**).
+
+.. include:: manftr.rst
diff --git a/a8eol.1 b/a8eol.1
index b68779d..78f2f2d 100644
--- a/a8eol.1
+++ b/a8eol.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "A8EOL" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "A8EOL" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
a8eol \- convert Atari 8-bit text files to/from UNIX/Windows/Mac
.\" RST source for a8eol(1) man page. Convert with:
@@ -79,8 +79,8 @@ tabs and backspaces).
.B \-c
Replace non\-printing characters with ^x (ASCII input) or {x}
(ATASCII input). This option also enables the \fB\-8\fP option. When
-the input file is ATASCII, the output resembles a program list‐
-ing from an old computer magazine (see \fBATASCII CODES\fP, below).
+the input file is ATASCII, the output resembles a program listing
+from an old computer magazine (see \fBATASCII CODES\fP, below).
.TP
.B \-p
Replace non\-printing characters with \fI\&.\fP (period, dot).
@@ -461,25 +461,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/a8eol.rst b/a8eol.rst
index ff81d82..c1c3b7b 100644
--- a/a8eol.rst
+++ b/a8eol.rst
@@ -61,8 +61,8 @@ Translation options:
-c
Replace non-printing characters with ^x (ASCII input) or {x}
(ATASCII input). This option also enables the **-8** option. When
- the input file is ATASCII, the output resembles a program list‐
- ing from an old computer magazine (see **ATASCII CODES**, below).
+ the input file is ATASCII, the output resembles a program listing
+ from an old computer magazine (see **ATASCII CODES**, below).
-p
Replace non-printing characters with *.* (period, dot).
diff --git a/a8utf8 b/a8utf8
deleted file mode 100755
index 0cca2ac..0000000
--- a/a8utf8
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/perl -w
-
-# convert A8 text to UTF-8. Control graphics characters are replaced with
-# nearest Unicode equivalents (mostly from the box-drawing range, or from
-# the basic-latin range with -i option).
-
-# Careful editing this script: you need an editor that groks UTF-8, or at
-# least one that won't mangle the UTF-8 sequences embedded in the tables
-# below.
-
-($SELF = $0) =~ s,.*/,,;
-
-binmode(STDOUT, ":utf8");
-binmode(STDIN, ":bytes");
-
-use utf8;
-
-%atascii_table = (
- 0 => "♥",
- 1 => "┣",
- 2 => "┃",
- 3 => "┛",
- 4 => "┫",
- 5 => "┓",
- 6 => "╱",
- 7 => "╲",
- 8 => "◢",
- 9 => "▗",
- 10 => "◣",
- 11 => "▝",
- 12 => "▘",
- 13 => "▔",
- 14 => "▁",
- 15 => "▖",
- 16 => "♣",
- 17 => "┏",
- 18 => "━",
- 19 => "╋",
- 20 => "●",
- 21 => "▄",
- 22 => "▎",
- 23 => "┳",
- 24 => "┻",
- 25 => "▌",
- 26 => "┗",
- 27 => "␛",
- 28 => "↑",
- 29 => "↓",
- 30 => "←",
- 31 => "→",
- 96 => "◆",
- 123 => "♠",
- 125 => "↰",
- 126 => "◀",
- 127 => "▶",
- 136 => "◤",
- 137 => "▛",
- 138 => "◥",
- 139 => "▙",
- 140 => "▟",
- 141 => "▆",
- 142 => "🮅",
- 143 => "▜",
- 148 => "◙",
- 149 => "▀",
- 150 => "🮊",
- 153 => "▐",
- 155 => "\n",
- 156 => "⍐",
- 157 => "⍗",
- 158 => "⍇",
- 159 => "⍈",
- 160 => "█",
-);
-
-%xl_intl_table = (
- 0 => "á",
- 1 => "ù",
- 2 => "Ñ",
- 3 => "É",
- 4 => "ç",
- 5 => "ô",
- 6 => "ò",
- 7 => "ì",
- 8 => "£",
- 9 => "ï",
- 10 => "ü",
- 11 => "ä",
- 12 => "Ö",
- 13 => "ú",
- 14 => "ó",
- 15 => "ö",
- 16 => "Ü",
- 17 => "â",
- 18 => "û",
- 19 => "î",
- 20 => "é",
- 21 => "è",
- 22 => "ñ",
- 23 => "ê",
- 24 => "ȧ",
- 25 => "à",
- 26 => "Ȧ",
- 27 => "␛",
- 28 => "↑",
- 29 => "↓",
- 30 => "←",
- 31 => "→",
- 96 => "¡",
- 123 => "Ä",
- 126 => "◀",
- 127 => "▶",
- 155 => "\n",
-);
-
-undef $/;
-
-$table = \%atascii_table;
-$print_table = 0;
-while(@ARGV && $ARGV[0] =~ /^-/) {
- for($ARGV[0]) {
- /^-i$/ && do { $table = \%xl_intl_table; next; };
- /^-t$/ && do { $print_table = 1; next; };
- /^-r$/ && do { $reverse = 1; next; };
- /^--?h/ && do { usage(0) };
- warn "$SELF: unknown option: $_\n";
- usage(1);
- }
- shift @ARGV;
-}
-
-if($reverse) {
- binmode(STDOUT, ":bytes");
- for(keys %$table) {
- $revtable{ord($table->{$_})} = chr($_);
- }
- $table = \%revtable;
-}
-
-if($print_table) {
- for(sort { $a <=> $b } keys %$table) {
- my $chr = translate(chr $_);
- $chr = '\n' if $chr eq "\n";
- printf '"%d","$%02x","%s"' . "\n", $_, $_, $chr;
- }
- exit 0;
-}
-
-$_ = <>;
-s/(.)/translate($1)/seg;
-print;
-
-sub translate {
- my $o = ord(shift);
- my $ret;
-
- $ret = $table->{$o};
- return $ret if defined($ret);
-
- $ret = $table->{$o & 0x7f};
- return $ret if defined($ret);
-
- return chr($o & 0x7f);
-}
-
-sub usage {
- print <<EOF;
-Usage: $SELF [--help] | [-t [-r] [-i]] | [-r] [-i] infile [infile ...]
-See man page for details.
-EOF
- exit $_[0];
-}
diff --git a/a8utf8.1 b/a8utf8.1
deleted file mode 100644
index beee34b..0000000
--- a/a8utf8.1
+++ /dev/null
@@ -1,118 +0,0 @@
-.\" Man page generated from reStructuredText.
-.
-.
-.nr rst2man-indent-level 0
-.
-.de1 rstReportMargin
-\\$1 \\n[an-margin]
-level \\n[rst2man-indent-level]
-level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
--
-\\n[rst2man-indent0]
-\\n[rst2man-indent1]
-\\n[rst2man-indent2]
-..
-.de1 INDENT
-.\" .rstReportMargin pre:
-. RS \\$1
-. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
-. nr rst2man-indent-level +1
-.\" .rstReportMargin post:
-..
-.de UNINDENT
-. RE
-.\" indent \\n[an-margin]
-.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
-.nr rst2man-indent-level -1
-.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
-.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
-..
-.TH "A8UTF8" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
-.SH NAME
-a8utf8 \- Convert Atari 8-bit text to UTF-8 encoded Unicode.
-.\" RST source for a8utf8(1) man page. Convert with:
-.
-.\" rst2man.py a8utf8.rst > a8utf8.1
-.
-.\" rst2man.py comes from the SBo development/docutils package.
-.
-.SH SYNOPSIS
-.sp
-\fIa8utf8\fP [\fB\-r\fP] [\fB\-i\fP] [\fIinfile\fP] [\fIinfile ...\fP]
-.sp
-\fIa8utf8\fP [\fB\-r\fP] [\fB\-i\fP] \fB\-t\fP
-.SH DESCRIPTION
-.sp
-Convert Atari 8\-bit ATASCII or XL ICS (International Character
-Set) text to UTF\-8 encoded Unicode. Control graphics characters are
-replaced with their nearest Unicode equivalents (mostly from the Box
-Drawing block, or from the Basic Latin block with \fB\-i\fP option).
-.sp
-If no \fIinfile\fP is given, input is read from standard input. Output always
-goes to standard output; to write to a file, use a command like:
-.INDENT 0.0
-.INDENT 3.5
-.sp
-.nf
-.ft C
-a8utf8 atari.txt > converted.txt
-.ft P
-.fi
-.UNINDENT
-.UNINDENT
-.sp
-The output is plain UTF\-8 Unicode, without BOM.
-.sp
-Inverse video (characters codes above \fB$80\fP) are translated to
-their non\-inverse equivalents, except \fB$9B\fP (Atari EOL), which is
-translated to \fB\en\fP (newline).
-.SH OPTIONS
-.INDENT 0.0
-.TP
-.B \-i
-Input uses Atari XL/XE International Character Set encoding, rather than
-ATASCII graphics.
-.TP
-.B \-t
-Print table of Atari to Unicode equivalents, in CSV format. Can
-be used with or without \fB\-i\fP and/or \fB\-r\fP (four different tables).
-.TP
-.B \-r
-Reverse conversion: Input is UTF\-8, output is ATASCII (or XL ICS, with \fB\-i\fP).
-Beware that printing ATASCII to a terminal may look funny, and may even confuse
-the terminal. Redirecting to a file is safe.
-.UNINDENT
-.SH COPYRIGHT
-.sp
-WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
-.SH AUTHOR
-.INDENT 0.0
-.IP B. 3
-Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
-.UNINDENT
-.SH SEE ALSO
-.sp
-\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
-\fBatr2xfd\fP(1),
-\fBatrsize\fP(1),
-\fBaxe\fP(1),
-\fBblob2c\fP(1),
-\fBblob2xex\fP(1),
-\fBcart2xex\fP(1),
-\fBdasm2atasm\fP(1),
-\fBf2toxex\fP(1),
-\fBfenders\fP(1),
-\fBrom2cart\fP(1),
-\fBunmac65\fP(1),
-\fBxexamine\fP(1),
-\fBxexcat\fP(1),
-\fBxexsplit\fP(1),
-\fBxfd2atr\fP(1),
-\fBxex\fP(5),
-\fBatascii\fP(7).
-.sp
-Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
-Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
-.\" Generated by docutils manpage writer.
-.
diff --git a/a8utf8.rst b/a8utf8.rst
deleted file mode 100644
index ec9fbba..0000000
--- a/a8utf8.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-.. RST source for a8utf8(1) man page. Convert with:
-.. rst2man.py a8utf8.rst > a8utf8.1
-.. rst2man.py comes from the SBo development/docutils package.
-
-======
-a8utf8
-======
-
---------------------------------------------------
-Convert Atari 8-bit text to UTF-8 encoded Unicode.
---------------------------------------------------
-
-.. include:: manhdr.rst
-
-SYNOPSIS
-========
-
-*a8utf8* [**-r**] [**-i**] [*infile*] [*infile ...*]
-
-*a8utf8* [**-r**] [**-i**] **-t**
-
-DESCRIPTION
-===========
-
-Convert Atari 8-bit ATASCII or XL ICS (International Character
-Set) text to UTF-8 encoded Unicode. Control graphics characters are
-replaced with their nearest Unicode equivalents (mostly from the Box
-Drawing block, or from the Basic Latin block with **-i** option).
-
-If no *infile* is given, input is read from standard input. Output always
-goes to standard output; to write to a file, use a command like::
-
- a8utf8 atari.txt > converted.txt
-
-The output is plain UTF-8 Unicode, without BOM.
-
-Inverse video (characters codes above **$80**) are translated to
-their non-inverse equivalents, except **$9B** (Atari EOL), which is
-translated to **\\n** (newline).
-
-OPTIONS
-=======
-
--i
- Input uses Atari XL/XE International Character Set encoding, rather than
- ATASCII graphics.
-
--t
- Print table of Atari to Unicode equivalents, in CSV format. Can
- be used with or without **-i** and/or **-r** (four different tables).
-
--r
- Reverse conversion: Input is UTF-8, output is ATASCII (or XL ICS, with **-i**).
- Beware that printing ATASCII to a terminal may look funny, and may even confuse
- the terminal. Redirecting to a file is safe.
-
-.. include:: manftr.rst
diff --git a/a8xd.1 b/a8xd.1
new file mode 100644
index 0000000..3f0b53e
--- /dev/null
+++ b/a8xd.1
@@ -0,0 +1,272 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "A8XD" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+a8xd \- Atari 8-bit ATASCII-aware hex dump
+.SH SYNOPSIS
+.sp
+\fIa8xd\fP [\fB\-i\fP] [\fB\-l\fP \fIlimit\fP] [\fB\-m\fP] [\fB\-o\fP offset] [\fB\-s\fP \fI[\-]seek\fP] [\fB\-u\fP] [\fB\-v\fP] [\fIinfile\fP]
+.SH DESCRIPTION
+.sp
+\fBa8xd\fP is a hex dump utility, similar to \fBxxd\fP(1), but it
+understands and prints ATASCII characters rather than ASCII.
+.sp
+The ATASCII codes are converted to UTF\-8, in the same way as
+\fBa8cat\fP(1). Codes with the high bit set are displayed in inverse
+video, using ANSI/VT\-100 escape sequences.
+.sp
+By default, the output is colorized (see \fBCOLORS\fP, below). The
+colors and inverse rendering apply to both the ATASCII and hex bytes.
+.sp
+Without \fIinfile\fP, or if \fIinfile\fP is \fB\-\fP, \fBa8xd\fP reads from standard input.
+.SH OPTIONS
+.INDENT 0.0
+.TP
+.B \-a
+ANTIC mode: treat the input as screen bytes (aka "internal codes")
+rather than ATASCII. Can usefully be combined with \fB\-g\fP or \fB\-f\fP\&.
+.TP
+.B \-f
+Like \fB\-g\fP, but using the top half of the character set. This is
+what you\(aqd see on the Atari with \fIGRAPHICS 1:POKE 756,226\fP\&.
+.TP
+.B \-g
+Graphics mode. Changes the printed characters and colorization so it
+looks like \fIGRAPHICS 1\fP (or 2) on the Atari.
+.TP
+.B \-i
+Print XL/XE International Character Set conversions instead of ATASCII.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-l \fIlen\fP
+Stop after dumping \fIlen\fP bytes. \fIlen\fP may be given in decimal or hex (with
+leading \fI0x\fP or \fI$\fP).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-m
+Monochrome mode. Disables color, but ATASCII characters with the high bit
+set are still displayed in inverse.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-o \fIoffset\fP
+Add \fIoffset\fP to displayed file position. \fIoffset\fP can be given in decimal
+or hex (with leading \fI0x\fP or \fI$\fP). Negative offsets are allowed, but they
+will be printed as very large positive numbers in the output (this matches
+\fBxxd\fP\(aqs behaviour).
+.TP
+.B \-s \fI[\-]seek\fP
+Start at \fIseek\fP bytes. Without \fI\-\fP, this is an absolute offset. With \fI\-\fP,
+it\(aqs relative to the end of the file. The \fI\-\fP option won\(aqt work when
+reading from standard input. \fIseek\fP may be given in decimal or hex
+(with leading \fI0x\fP or \fI$\fP).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-u
+Use uppercase letters for hex digits; the default is lowercase.
+.TP
+.B \-v
+Verbose. Shows various debug messages that are probably only useful
+if you\(aqre hacking on \fBa8xd\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \fB\-\-\fP
+End of options; the next argument is the filename. Use this if you\(aqre
+trying to work with files whose names begin with \fI\-\fP\&.
+.TP
+.B \fB\-h\fP, \fB\-\-help\fP
+Show built\-in help and exit.
+.TP
+.B \fB\-\-version\fP
+Show version number and exit.
+.UNINDENT
+.SH COLORS
+.sp
+The default color scheme is:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+Non\-control characters are green. This includes alphanumerics, spaces, and
+punctuation. These are the characters that ATASCII has in common with
+ASCII.
+.IP \(bu 2
+Graphics characters are yellow. This includes \fB$01\fP to \fB$1a\fP (the
+alphabet, with the Control key held down), \fB$60\fP (the diamond), and
+\fB$7b\fP (the spade).
+.IP \(bu 2
+Codes \fB$00\fP (null, or ATASCII heart) and \fB$9B\fP (EOL) are red. These
+characters are used as delimiters, so it makes sense for them to
+stand out.
+.IP \(bu 2
+Cursor control characters are purple. These are characters that perform
+some action when printed to the \fIE:\fP device. These are:
+.INDENT 2.0
+.INDENT 3.5
+.INDENT 0.0
+.TP
+.B \fB$1b\fP
+Escape.
+.TP
+.B \fB$1c\fP through \fB$1f\fP
+Cursor movement (up/down/left/right arrows).
+.TP
+.B \fB$7d\fP
+Clear screen.
+.TP
+.B \fB$7e\fP
+Backspace.
+.TP
+.B \fB$7f\fP
+Tab.
+.TP
+.B \fB$9c\fP
+Delete line.
+.TP
+.B \fB$9d\fP
+Insert line.
+.TP
+.B \fB$9e\fP
+Clear tab stop.
+.TP
+.B \fB$9f\fP
+Set tab stop.
+.TP
+.B \fB$fd\fP
+Bell.
+.TP
+.B \fB$fe\fP
+Delete character.
+.TP
+.B \fB$ff\fP
+Insert character.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+In \fB\-f\fP and \fB\-g\fP modes, the above doesn\(aqt apply. Instead, the
+colors are (close to) the colors that would appear in \fIGRAPHICS 1\fP,
+with the default palette.
+.SH NOTES
+.sp
+\fBa8xd\fP requires the terminal emulator to support UTF\-8 and use a
+font with the necessary glyphs. The author has tested extensively
+with \fBurxvt\fP(1) (aka \fBrxvt\-unicode\fP) and \fBxterm\fP(1), using
+the \fIDeja Vu Sans Mono\fP, \fIJetBrains Mono\fP, \fILiberation Mono\fP,
+and \fISymbola\fP fonts. Also \fBkitty\fP(1), \fBxfce4\-terminal\fP(1),
+KDE/Plasma 5\(aqs \fBkonsole\fP(1), \fBgnome\-terminal\fP(1) 3.43.90, and
+\fBst\fP(1) from suckless.org have been lightly tested and seem to work
+fine. Even the Linux console works, except that you won\(aqt be able to
+find a console font with all the necessary glyphs (I may create one
+someday).
+.sp
+\fBa8xd\fP only supports terminals that use ANSI\-style escape sequences
+for color and inverse video. This isn\(aqt much of a limitation, since
+all modern X, Wayland, Mac, etc terminal emulators have support for
+this... but it might annoy you if you\(aqre trying to use an Atari ST
+with a VT52 emulator as a serial terminal. Sorry.
+.sp
+\fBa8xd\fP supports a useful subset of \fBxxd\fP(1) options. The main things
+missing are:
+.INDENT 0.0
+.IP \(bu 2
+\fB\-r\fP (revert).
+.IP \(bu 2
+\fB\-include\fP (output as C include) and all options related to it.
+.IP \(bu 2
+\fB\-g\fP (grouping; \fBa8xd\fP always uses a group size of 1 byte).
+.IP \(bu 2
+\fB\-E\fP (EBCDIC mode).
+.IP \(bu 2
+\fB\-p\fP (PostScript/continuous dump).
+.IP \(bu 2
+\fB\-cols\fP (\fBa8xd\fP only supports 16 column dumps).
+.IP \(bu 2
+\fB\-b\fP (bits mode).
+.IP \(bu 2
+support for files larger than 2GB. This won\(aqt be a problem for Atari 8\-bit\-related files!
+.IP \(bu 2
+replacing duplicate lines in the output with \fB*\fP\&.
+.UNINDENT
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/a8xd.c b/a8xd.c
new file mode 100644
index 0000000..1a48312
--- /dev/null
+++ b/a8xd.c
@@ -0,0 +1,400 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <locale.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "atables.h"
+
+/* printf() formats for lower/uppercase hex. */
+#define LC_WORD_FMT "%04x"
+#define LC_BYTE_FMT "%02x"
+#define UC_WORD_FMT "%04X"
+#define UC_BYTE_FMT "%02X"
+
+/* colors. don't use black or white: one or the other is likely
+ the terminal's text color already.
+ don't use blue because it's hard to read. */
+#define C_RED 1
+#define C_GREEN 2
+#define C_YELLOW 3
+#define C_PURPLE 5
+#define C_CYAN 6
+
+/* translation table (see atables.c), choices are
+ ata2utf, ics2utf, or magazine. */
+const char **table = ata2utf;
+
+/* hardcoded ANSI-style escape sequences, work fine on
+ all modern terminal emulators. */
+const char *inverse_on = "\x1b[7m";
+const char *inverse_off = "\x1b[0m";
+const char *color_off = "\x1b[0m";
+
+/* -u option changes these. */
+const char *word_format = LC_WORD_FMT;
+const char *byte_format = LC_BYTE_FMT;
+
+/* command line options change these. */
+int verbose = 0, color = 1, disp_offset = 0, maxlen = 0;
+int seek_whence = 0, seekpos = 0, filepos = 0, limit = 0;
+int graphics = 0, screencodes = 0, high_font = 0;
+
+const char *self;
+
+void set_self(const char *argv0) {
+ char *p;
+
+ self = argv0;
+ p = strrchr(self, '/');
+ if(p) self = p + 1;
+}
+
+void die(const char *msg) {
+ fprintf(stderr, "%s: %s\n", self, msg);
+ exit(1);
+}
+
+void print_help(void) {
+ printf("Usage:\n %s [-a] [-f] [-g] [-i] [-l limit] [-m] [-o offset] [-s [-]seek] [-u] [-v] [file]\n", self);
+ printf(" -a: Input is ANTIC screencodes (default is ATASCII).\n");
+ printf(" -g: GR.1/2 style colorization.\n");
+ printf(" -i: Input is XL intl charset (default is ATASCII).\n");
+ printf(" -l: Stop after <limit> bytes.\n");
+ printf(" -m: Monochrome (color off).\n");
+ printf(" -o: Add <offset> to displayed byte positions.\n");
+ printf(" -s: Seek <seek> bytes into input (with -, seek back from EOF).\n");
+ printf(" -u: Uppercase hex digits (default is lowercase).\n");
+ printf(" -v: Verbose debugging info.\n");
+ printf("With no [file], or -, reads from stdin.\n");
+}
+
+int parse_num_arg(const char *arg) {
+ int got;
+
+ if(sscanf(arg, "0x%x", &got) != 1)
+ if(sscanf(arg, "$%x", &got) != 1)
+ if(sscanf(arg, "%d", &got) != 1) {
+ fprintf(stderr, "%s: invalid numeric argument '%s'.", self, arg);
+ exit(1);
+ }
+
+ return got;
+}
+
+void parse_seek_arg(const char *arg) {
+ seek_whence = SEEK_SET;
+
+ if(*arg == '-') {
+ seek_whence = SEEK_END;
+ }
+
+ seekpos = parse_num_arg(arg);
+}
+
+int parse_offset_arg(const char *arg) {
+ int got;
+
+ got = parse_num_arg(arg);
+
+ return got;
+}
+
+int parse_limit_arg(const char *arg) {
+ int got;
+
+ got = parse_num_arg(arg);
+ if(got < 0)
+ die("negative arguments to -l (limit) are not supported.");
+
+ return got;
+}
+
+FILE *open_input(const char *file) {
+ FILE *input;
+
+ if(file[0] == '-' && file[1] == 0) {
+ if(freopen(NULL, "rb", stdin)) {
+ input = stdin;
+ } else {
+ fprintf(stderr, "%s: ", self);
+ perror("(standard input)");
+ return NULL;
+ }
+ if(verbose)
+ fprintf(stderr, "%s: reading from standard input.\n", self);
+ } else {
+ if(!(input = fopen(file, "rb"))) {
+ perror(file);
+ return NULL;
+ }
+ if(verbose)
+ fprintf(stderr, "%s: reading from file '%s'.\n", self, file);
+ }
+
+ return input;
+}
+
+int get_text_color(unsigned char c) {
+ unsigned char c7 = c & 0x7f;
+
+ if(c == 0 || c == 0x9b) {
+ return C_RED;
+ } else if((c7 >= 0x1b && c7 <= 0x1f) || (c7 >= 0x7d)) {
+ /* cursor control characters:
+ - 0x1b (esc)
+ - 0x1c-0x1f (arrows), 0x9c-0x9f
+ - 0x7d/0xf3 (cls, bell)
+ - 0x7e, 0xfe (delete line, char)
+ - 0x7f, 0xff (tab, insert char)
+ */
+ return C_PURPLE;
+ } else if(c7 < 32 || c7 == 0x60 || c7 == 0x7b) {
+ return C_YELLOW;
+ } else {
+ return C_GREEN;
+ }
+}
+
+int get_graphics_color(unsigned char c) {
+ if(c < 0x20)
+ return C_GREEN;
+ else if(c >= 0x20 && c < 0x60)
+ return C_YELLOW;
+ else if(c >= 0x60 && c < 0x80)
+ return C_GREEN;
+ else if(c >= 0x80 && c < 0xa0)
+ return C_RED;
+ else if(c >= 0xa0 && c < 0xe0)
+ return C_CYAN;
+ else /* c >= 0xe0 */
+ return C_RED;
+}
+
+char *get_color(unsigned char c) {
+ int color;
+ static char outbuf[32];
+
+ if(graphics) {
+ color = get_graphics_color(c);
+ } else {
+ color = get_text_color(c);
+ }
+
+ if(color) {
+ sprintf(outbuf, "\x1b[0;3%dm", color);
+ } else {
+ outbuf[0] = '\0';
+ }
+
+ return outbuf;
+}
+
+/* displaying ATASCII (not screencodes) in GR.1 or GR.2:
+ $00-$1F get displayed in green, as $20-$2F.
+ $20-$5F get displayed in orange, as themselves.
+ $60-$7F get displayed in green, as $40-$5F.
+ for $80-$FF, same thing, but green is red, and orange is blue.
+*/
+unsigned char get_graphics(unsigned char c) {
+ c &= 0x7f;
+ if(c < 0x20)
+ c += 0x20;
+ else if(c >= 0x60)
+ c -= 0x20;
+ return c;
+}
+
+unsigned char get_high_graphics(unsigned char c) {
+ c &= 0x7f;
+ if(c >= 0x20 && c < 0x40)
+ c -= 0x20;
+ else if(c >= 0x40)
+ c += 0x20;
+ return c;
+}
+
+unsigned char screen2ata(unsigned char c) {
+ unsigned char c7 = c & 0x7f;
+
+ if(c7 < 0x40)
+ return c + 0x20;
+ if(c7 >= 0x40 && c7 < 0x60)
+ return c - 0x40;
+ return c;
+}
+
+void fake_seek(FILE *input) {
+ char junkbuf[1024];
+ int pos = 0, chunksize;
+
+ if(verbose)
+ fprintf(stderr, "%s: faking fseek() for stdin, skipping %d bytes.\n", self, seekpos);
+
+ while(pos < seekpos) {
+ chunksize = seekpos - pos;
+ if(chunksize > 1024) chunksize = 1024;
+ if(fread(junkbuf, 1, chunksize, input) != chunksize)
+ die("can't seek past end of input");
+ pos += chunksize;
+ }
+}
+
+void seek_input(FILE *input) {
+ if(verbose)
+ fprintf(stderr, "%s: seeking %d bytes (whence = %d) in input.\n", self, seekpos, seek_whence);
+ if(input == stdin) {
+ /* can't fseek() a stream, fake it */
+ if(seek_whence != SEEK_SET)
+ die("can't seek from the end of standard input.");
+ fake_seek(input);
+ } else {
+ if(fseek(input, seekpos, seek_whence) < 0) {
+ fprintf(stderr, "%s: ", self);
+ perror("fseek() failed");
+ exit(1);
+ }
+ if((filepos = ftell(input)) < 0) {
+ fprintf(stderr, "%s: ", self);
+ perror("ftell() failed");
+ exit(1);
+ }
+ }
+}
+
+void append_str_f(char *buf, int *pos, const char *fmt, const char *str) {
+ *pos += sprintf(buf + *pos, fmt, str);
+}
+
+void append_str(char *buf, int *pos, const char *str) {
+ append_str_f(buf, pos, "%s", str);
+}
+
+void append_hex(char *buf, int *pos, const unsigned char byte) {
+ *pos += sprintf(buf + *pos, byte_format, byte);
+}
+
+
+void dump_line(const unsigned char *buf, int len) {
+ char hex[1024], asc[1024];
+ int hpos = 0, apos = 0, count = len;
+ unsigned char c, inv;
+
+ memset(hex, 0, sizeof(hex));
+ memset(asc, 0, sizeof(asc));
+
+ printf(word_format, filepos + disp_offset);
+ fputs(": ", stdout);
+
+ while(len) {
+ c = *buf;
+ inv = !graphics && (c & 0x80);
+ if(screencodes) c = screen2ata(c);
+
+ hpos += printf("%s", get_color(c));
+ if(inv) hpos += printf("%s", inverse_on);
+ hpos += printf(byte_format, *buf); /* *buf here, not c! */
+ if(color || inv) hpos += printf("%s", color_off);
+ putchar(' ');
+ hpos++;
+ if(count - len == 7) {
+ putchar(' ');
+ hpos++;
+ }
+
+ if(color) append_str(asc, &apos, get_color(c));
+ if(inv) append_str(asc, &apos, inverse_on);
+ if(graphics) {
+ if(high_font)
+ c = get_high_graphics(c);
+ else
+ c = get_graphics(c);
+ }
+ apos += sprintf(asc + apos, "%s", table[c & 0x7f]);
+ if(color || inv) append_str(asc, &apos, color_off);
+
+ filepos++;
+ buf++;
+ len--;
+ }
+
+ /* what shall we use to fill the empty spaces? */
+ if(count < 8) putchar(' ');
+ for(; count < 16; count++) fputs(" ", stdout);
+
+ printf(" %s\n", asc);
+}
+
+int a8xd(const char *file) {
+ FILE *input;
+ int c, len = 0, count = 0;
+ unsigned char buf[16];
+
+ if( !(input = open_input(file)) )
+ return 1;
+
+ if(seekpos) seek_input(input);
+
+ while( (c = fgetc(input)) != EOF ) {
+ if(limit && (count == limit)) break;
+ count++;
+ if(len && (len % 16 == 0)) {
+ dump_line(buf, len);
+ len = 0;
+ }
+ buf[len++] = c;
+ }
+
+ if(len) dump_line(buf, len);
+
+ if(verbose)
+ fprintf(stderr, "%s: dumped %d (0x%04x) bytes from '%s'.\n", self, count, count, file);
+
+ fclose(input);
+ return 0;
+}
+
+int main(int argc, char **argv) {
+ int opt, result = 0;
+
+ set_self(argv[0]);
+
+ if(argc > 1 && strcmp(argv[1], "--help") == 0) {
+ print_help();
+ exit(0);
+ }
+
+ if(argc > 1 && strcmp(argv[1], "--version") == 0) {
+ printf("%s %s\n", self, VERSION);
+ exit(0);
+ }
+
+ while( (opt = getopt(argc, argv, "vhimus:o:l:gaf")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 'h': print_help(); exit(0); break;
+ case 'i': table = ics2utf; break;
+ case 'm': color = 0; break;
+ case 'u': word_format = UC_WORD_FMT; byte_format = UC_BYTE_FMT; break;
+ case 's': parse_seek_arg(optarg); break;
+ case 'o': disp_offset = parse_offset_arg(optarg); break;
+ case 'l': limit = parse_limit_arg(optarg); break;
+ case 'g': graphics = 1; break;
+ case 'a': screencodes = 1; break;
+ case 'f': graphics = high_font = 1; break;
+ default: print_help(); exit(1); break;
+ }
+ }
+
+ if(optind < argc - 1)
+ die("Only one filename is supported.");
+
+ if(optind >= argc)
+ result = a8xd("-");
+ else
+ result = a8xd(argv[optind]);
+
+ exit(result);
+}
diff --git a/a8xd.rst b/a8xd.rst
new file mode 100644
index 0000000..3dc2b07
--- /dev/null
+++ b/a8xd.rst
@@ -0,0 +1,187 @@
+====
+a8xd
+====
+
+----------------------------------
+Atari 8-bit ATASCII-aware hex dump
+----------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+*a8xd* [**-i**] [**-l** *limit*] [**-m**] [**-o** offset] [**-s** *[-]seek*] [**-u**] [**-v**] [*infile*]
+
+DESCRIPTION
+===========
+
+**a8xd** is a hex dump utility, similar to **xxd**\(1), but it
+understands and prints ATASCII characters rather than ASCII.
+
+The ATASCII codes are converted to UTF-8, in the same way as
+**a8cat**\(1). Codes with the high bit set are displayed in inverse
+video, using ANSI/VT-100 escape sequences.
+
+By default, the output is colorized (see **COLORS**, below). The
+colors and inverse rendering apply to both the ATASCII and hex bytes.
+
+Without *infile*, or if *infile* is **-**, **a8xd** reads from standard input.
+
+OPTIONS
+=======
+
+-a
+ ANTIC mode: treat the input as screen bytes (aka "internal codes")
+ rather than ATASCII. Can usefully be combined with **-g** or **-f**.
+
+-f
+ Like **-g**, but using the top half of the character set. This is
+ what you'd see on the Atari with *GRAPHICS 1:POKE 756,226*.
+
+-g
+ Graphics mode. Changes the printed characters and colorization so it
+ looks like *GRAPHICS 1* (or 2) on the Atari.
+
+-i
+ Print XL/XE International Character Set conversions instead of ATASCII.
+
+-l *len*
+ Stop after dumping *len* bytes. *len* may be given in decimal or hex (with
+ leading *0x* or *$*).
+
+-m
+ Monochrome mode. Disables color, but ATASCII characters with the high bit
+ set are still displayed in inverse.
+
+-o *offset*
+ Add *offset* to displayed file position. *offset* can be given in decimal
+ or hex (with leading *0x* or *$*). Negative offsets are allowed, but they
+ will be printed as very large positive numbers in the output (this matches
+ **xxd**\'s behaviour).
+
+-s *[-]seek*
+ Start at *seek* bytes. Without *-*, this is an absolute offset. With *-*,
+ it's relative to the end of the file. The *-* option won't work when
+ reading from standard input. *seek* may be given in decimal or hex
+ (with leading *0x* or *$*).
+
+-u
+ Use uppercase letters for hex digits; the default is lowercase.
+
+-v
+ Verbose. Shows various debug messages that are probably only useful
+ if you're hacking on **a8xd**.
+
+**--**
+ End of options; the next argument is the filename. Use this if you're
+ trying to work with files whose names begin with *-*.
+
+**-h**, **--help**
+ Show built-in help and exit.
+
+**--version**
+ Show version number and exit.
+
+COLORS
+======
+
+The default color scheme is:
+
+ - Non-control characters are green. This includes alphanumerics, spaces, and
+ punctuation. These are the characters that ATASCII has in common with
+ ASCII.
+
+ - Graphics characters are yellow. This includes **$01** to **$1a** (the
+ alphabet, with the Control key held down), **$60** (the diamond), and
+ **$7b** (the spade).
+
+ - Codes **$00** (null, or ATASCII heart) and **$9B** (EOL) are red. These
+ characters are used as delimiters, so it makes sense for them to
+ stand out.
+
+ - Cursor control characters are purple. These are characters that perform
+ some action when printed to the *E:* device. These are:
+
+ **$1b**
+ Escape.
+
+ **$1c** through **$1f**
+ Cursor movement (up/down/left/right arrows).
+
+ **$7d**
+ Clear screen.
+
+ **$7e**
+ Backspace.
+
+ **$7f**
+ Tab.
+
+ **$9c**
+ Delete line.
+
+ **$9d**
+ Insert line.
+
+ **$9e**
+ Clear tab stop.
+
+ **$9f**
+ Set tab stop.
+
+ **$fd**
+ Bell.
+
+ **$fe**
+ Delete character.
+
+ **$ff**
+ Insert character.
+
+In **-f** and **-g** modes, the above doesn't apply. Instead, the
+colors are (close to) the colors that would appear in *GRAPHICS 1*,
+with the default palette.
+
+NOTES
+=====
+
+**a8xd** requires the terminal emulator to support UTF-8 and use a
+font with the necessary glyphs. The author has tested extensively
+with **urxvt**\(1) (aka **rxvt-unicode**) and **xterm**\(1), using
+the *Deja Vu Sans Mono*, *JetBrains Mono*, *Liberation Mono*,
+and *Symbola* fonts. Also **kitty**\(1), **xfce4-terminal**\(1),
+KDE/Plasma 5's **konsole**\(1), **gnome-terminal**\(1) 3.43.90, and
+**st**\(1) from suckless.org have been lightly tested and seem to work
+fine. Even the Linux console works, except that you won't be able to
+find a console font with all the necessary glyphs (I may create one
+someday).
+
+**a8xd** only supports terminals that use ANSI-style escape sequences
+for color and inverse video. This isn't much of a limitation, since
+all modern X, Wayland, Mac, etc terminal emulators have support for
+this... but it might annoy you if you're trying to use an Atari ST
+with a VT52 emulator as a serial terminal. Sorry.
+
+**a8xd** supports a useful subset of **xxd**\(1) options. The main things
+missing are:
+
+- **-r** (revert).
+
+- **-include** (output as C include) and all options related to it.
+
+- **-g** (grouping; **a8xd** always uses a group size of 1 byte).
+
+- **-E** (EBCDIC mode).
+
+- **-p** (PostScript/continuous dump).
+
+- **-cols** (**a8xd** only supports 16 column dumps).
+
+- **-b** (bits mode).
+
+- support for files larger than 2GB. This won't be a problem for Atari 8-bit-related files!
+
+- replacing duplicate lines in the output with **\***.
+
+.. include:: manftr.rst
diff --git a/abas2html b/abas2html
new file mode 100755
index 0000000..6da890f
--- /dev/null
+++ b/abas2html
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+# this is supposed to be POSIX sh compliant. their getopts docs:
+# https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html
+
+SELF="$( echo $0 | sed 's,.*/,,' )"
+
+die() {
+ echo "$SELF: $1" >& 2
+ exit 1
+}
+
+checkbin() {
+ if ! which "$1" >/dev/null 2>/dev/null; then
+ die "$1 not found on PATH, can't continue"
+ fi
+}
+
+print_help() {
+ cat <<EOF
+$SELF: convert tokenized Atari BASIC to HTML
+B. Watson <urchlay@slackware.uk>, WTFPL
+Usage: $SELF -a<aha-options> -b<basver> -m input.bas <output.html>
+ -a next option is passed to aha(1). may be used multiple times.
+ -b set BASIC dialect. default is autodetection. valid dialects:
+ -ba Atari 8K BASIC
+ -ba+ OSS BASIC/A+
+ -bm Atari Microsoft BASIC
+ -bt Turbo BASIC XL
+ -bxl OSS BASIC XL
+ -bxe OSS BASIC XE
+ -bic OSS Integer BASIC (cartridge version)
+ -bid OSS Integer BASIC (disk version)
+ -m monochrome: disable color syntax highlighting.
+if output filename is missing, it defaults to the input filename, with
+the extension changed to .html (e.g. FOO.BAS => FOO.html).
+EOF
+ exit $1
+}
+
+# main()
+if [ "$*" = "--help" ]; then
+ print_help 0
+fi
+
+while getopts ":hb:a:mMn" opt; do
+ case "$opt" in
+ b) BASVER="$OPTARG" ;;
+ a) AHA_OPTS="$AHA_OPTS $OPTARG" ;;
+ m|M|n) MONO="1" ;;
+ h) print_help 0 ;;
+ *) die "invalid option -$OPTARG" ;;
+ esac
+done
+
+shift $(($OPTIND - 1))
+
+if [ -z "$1" ]; then
+ die "no input file given (try -h)"
+else
+ infile="$1"
+fi
+
+if [ -n "$2" ]; then
+ outfile="$2"
+else
+ outfile="$( echo "$infile" | sed 's,\.[^.]*$,.html,' )"
+ if [ "$infile" = "$outfile" ]; then
+ outfile="$infile".html
+ fi
+fi
+
+if [ "$BASVER" = "" ]; then
+ checkbin whichbas
+ whichbas -s "$infile"
+ case "$?" in
+ 3) BASVER="a" ;;
+ 4|7|8|9) BASVER="t" ;;
+ 5) BASVER="xl" ;;
+ 6|12) BASVER="xe" ;;
+ 11) BASVER="m" ;;
+ 14) BASVER="a+" ;;
+ 15) BASVER="ic" ;;
+ 16) BASVER="id" ;;
+ *) die "can't detect BASIC dialect; use -b<xx> option" ;;
+ esac
+fi
+
+case "$BASVER" in
+ m) LISTER=listamsb ; BASVER="" ;;
+ a|t|xl|xe|a+|id|ic) LISTER=listbas ; BASVER="-b$BASVER" ;;
+ *) die "$BASVER not a valid BASIC dialect" ;;
+esac
+
+checkbin $LISTER
+checkbin aha
+if [ "$LISTER" = "listamsb" ]; then
+ if [ "$MONO" = "1" ]; then
+ MONO_OPT="-M"
+ else
+ checkbin "${COLORIZE_AMSB:-colorize-amsb}"
+ fi
+else
+ if [ "$MONO" = "1" ]; then
+ MONO_OPT="-n"
+ fi
+fi
+
+exec $LISTER $BASVER $MONO_OPT "$infile" | aha -t "$infile" $AHA_OPTS > "$outfile"
diff --git a/abas2html.1 b/abas2html.1
new file mode 100644
index 0000000..03d48c5
--- /dev/null
+++ b/abas2html.1
@@ -0,0 +1,172 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "ABAS2HTML" 1 "2025-04-01" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+abas2html \- Create HTML from tokenized Atari BASIC
+.SH SYNOPSIS
+.sp
+\fBabas2html\fP [\fB\-h\fP] [\fB\-a\fP \fIaha\-opts\fP] [\fB\-b\fP \fIdialect\fP] [\fB\-m\fP] \fIinput\-file\fP [\fIoutput\-file\fP]
+.SH DESCRIPTION
+.sp
+\fBabas2html\fP is a shell script wrapper for \fBlistbas\fP(1),
+\fBlistamsb\fP(1), and \fBaha\fP(1). It creates an HTML file of the
+program listing, with color syntax highlighting by default. ATASCII
+characters are converted to Unicode equivalents, and inverse video is
+displayed correctly.
+.sp
+\fIinput\-file\fP must be a tokenized BASIC program, either Atari 8K BASIC,
+OSS BASIC/A+, Atari Microsoft BASIC, Turbo BASIC XL, OSS BASIC XL, or
+OSS BASIC XE. You can specify the BASIC dialect (see \fB\-b\fP, below) or
+let it be autodetected (via \fBwhichbas\fP(1)).
+.sp
+\fIoutput\-file\fP will be an HTML file, created by \fBaha\fP(1). If
+no output filename is given, it will be costructed by changing the
+filename extension to \fI\&.html\fP, or (if there is no extension) by adding
+\fI\&.html\fP to the input filename.
+.sp
+\fBaha\fP can be installed from \fI\%https://github.com/theZiz/aha\fP or from
+your distribution\(aqs package repository (e.g. \fBsbopkg \-i aha\fP on Slackware,
+\fBapt install aha\fP on Debian or Ubuntu).
+.SH OPTIONS
+.INDENT 0.0
+.TP
+.B \-a
+Next option is passed to \fBaha\fP(1). May be used multiple times.
+Examples:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+abas2html \-a \-b \-a \-n FOO.BAS # black background, no header
+abas2html \-a"\-b \-n" FOO.BAS # same thing, quotes required
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.TP
+.B \-b
+Set BASIC dialect. Default is autodetection. Valid dialects:
+.sp
+\fB\-ba\fP Atari 8K BASIC
+.sp
+\fB\-ba+\fP OSS BASIC/A+
+.sp
+\fB\-bm\fP Atari Microsoft BASIC
+.sp
+\fB\-bt\fP Turbo BASIC XL
+.sp
+\fB\-bxl\fP OSS BASIC XL
+.sp
+\fB\-bxe\fP OSS BASIC XE
+.sp
+\fB\-bic\fP OSS Integer BASIC (cartridge version)
+.sp
+\fB\-bid\fP OSS Integer BASIC (disk version)
+.TP
+.B \-m
+Monochrome: disable color syntax highlighting.
+.UNINDENT
+.SH ENVIRONMENT
+.INDENT 0.0
+.TP
+.B \fBPATH\fP
+The various programs executed are searched for in \fBPATH\fP\&. If you don\(aqt
+have the utilities installed system\-wide, you can use something like:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+PATH=.:$PATH ./abas2html <...>
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.TP
+.B \fBLISTBAS_OPTS\fP
+See \fBlistbas\fP(1) for usage. Note that Atari Microsoft BASIC programs
+are listed with \fBlistamsb\fP, which is not affected by this environment
+variable.
+.TP
+.B \fBCOLORIZE_AMSB\fP
+Used by \fBlistamsb\fP(1) when listing Atari Microsoft BASIC programs.
+.UNINDENT
+.SH EXIT STATUS
+.sp
+0 for success, non\-zero for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/abas2html.rst b/abas2html.rst
new file mode 100644
index 0000000..73e803e
--- /dev/null
+++ b/abas2html.rst
@@ -0,0 +1,90 @@
+=========
+abas2html
+=========
+
+--------------------------------------
+Create HTML from tokenized Atari BASIC
+--------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+**abas2html** [**-h**] [**-a** *aha-opts*] [**-b** *dialect*] [**-m**] *input-file* [*output-file*]
+
+DESCRIPTION
+===========
+
+**abas2html** is a shell script wrapper for **listbas**\(1),
+**listamsb**\(1), and **aha**\(1). It creates an HTML file of the
+program listing, with color syntax highlighting by default. ATASCII
+characters are converted to Unicode equivalents, and inverse video is
+displayed correctly.
+
+*input-file* must be a tokenized BASIC program, either Atari 8K BASIC,
+OSS BASIC/A+, Atari Microsoft BASIC, Turbo BASIC XL, OSS BASIC XL, or
+OSS BASIC XE. You can specify the BASIC dialect (see **-b**, below) or
+let it be autodetected (via **whichbas**\(1)).
+
+*output-file* will be an HTML file, created by **aha**\(1). If
+no output filename is given, it will be costructed by changing the
+filename extension to *.html*, or (if there is no extension) by adding
+*.html* to the input filename.
+
+**aha** can be installed from https://github.com/theZiz/aha or from
+your distribution's package repository (e.g. **sbopkg -i aha** on Slackware,
+**apt install aha** on Debian or Ubuntu).
+
+OPTIONS
+=======
+
+-a Next option is passed to **aha**\(1). May be used multiple times.
+ Examples::
+
+ abas2html -a -b -a -n FOO.BAS # black background, no header
+ abas2html -a"-b -n" FOO.BAS # same thing, quotes required
+
+-b Set BASIC dialect. Default is autodetection. Valid dialects:
+
+ **-ba** Atari 8K BASIC
+
+ **-ba+** OSS BASIC/A+
+
+ **-bm** Atari Microsoft BASIC
+
+ **-bt** Turbo BASIC XL
+
+ **-bxl** OSS BASIC XL
+
+ **-bxe** OSS BASIC XE
+
+ **-bic** OSS Integer BASIC (cartridge version)
+
+ **-bid** OSS Integer BASIC (disk version)
+
+-m Monochrome: disable color syntax highlighting.
+
+ENVIRONMENT
+===========
+
+**PATH**
+ The various programs executed are searched for in **PATH**. If you don't
+ have the utilities installed system-wide, you can use something like::
+
+ PATH=.:$PATH ./abas2html <...>
+
+**LISTBAS_OPTS**
+ See **listbas**\(1) for usage. Note that Atari Microsoft BASIC programs
+ are listed with **listamsb**, which is not affected by this environment
+ variable.
+
+**COLORIZE_AMSB**
+ Used by **listamsb**\(1) when listing Atari Microsoft BASIC programs.
+
+EXIT STATUS
+===========
+
+0 for success, non-zero for failure.
+
+.. include:: manftr.rst
diff --git a/amsb.7 b/amsb.7
new file mode 100644
index 0000000..864b72d
--- /dev/null
+++ b/amsb.7
@@ -0,0 +1,600 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "AMSB" 7 "2025-03-13" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+amsb \- Atari Microsoft BASIC Notes
+.SH DESCRIPTION
+.sp
+Atari Microsoft BASIC is actually a pretty cool BASIC for the Atari 8\-bit. I never
+got the chance to use it \(aqback in the day\(aq because it was expensive,
+required a floppy drive and at least 32K of RAM (my poor 400 had a
+tape drive for the first few years), and then later on, there was
+Turbo BASIC XL, which was cooler than AMSB, and also freeware.
+.sp
+This file is a collection of notes I made to myself while developing
+listamsb. The information here might be useful (e.g. if you\(aqre trying
+to repair a damaged AMSB file) and hopefully is interesting. Enjoy!
+.sp
+This file is part of the bw\-atari8\-utils source. You can get the
+latest version of the source from:
+.sp
+\fI\%https://slackware.uk/~urchlay/repos/bw\-atari8\-tools\fP
+.sp
+\&...which you can either view with a web browser or use with the \(aqgit
+clone\(aq command.
+.SH NOTES
+.SS Tokenized file format
+.sp
+File begins with a 3\-byte header:
+.TS
+center;
+|l|l|.
+_
+T{
+Offset
+T} T{
+Purpose
+T}
+_
+T{
+0
+T} T{
+0 for a normal program, 1 for LOCKed (encrypted)
+T}
+_
+T{
+1
+T} T{
+LSB, program length, not counting the 3\-byte header
+T}
+_
+T{
+2
+T} T{
+MSB, program length
+T}
+_
+.TE
+.sp
+The program length should always be the actual file size minus 3. If
+it\(aqs not, the file has either been truncated or had junk added to the
+end. In a LOCKed program, the program length bytes are not encrypted.
+.sp
+After the header, the lines of code (encrypted, for LOCKed programs).
+Each line has a 4\-byte header:
+.TS
+center;
+|l|l|.
+_
+T{
+0
+T} T{
+LSB, address of the last byte of this line...
+T}
+_
+T{
+1
+T} T{
+MSB, address ...which is ignored on LOAD!
+T}
+_
+T{
+2
+T} T{
+LSB, line number
+T}
+_
+T{
+3
+T} T{
+MSB, line number
+T}
+_
+.TE
+.sp
+The rest of the line is the tokens, terminated by a $00 byte. The
+next 2 bytes after the $00 is the last\-byte offset of the next line.
+.sp
+The last "line" of the program has a $0000 offset, which indicates the
+end of the program. Since the actual last line ends with a $00, that
+means there will be three $00 bytes in a row as the last 3 bytes of
+the file. And that\(aqs the \fIonly\fP place 3 $00\(aqs in a row will occur.
+.sp
+Tokenization is "lightweight": there are no tokenized numerics,
+they\(aqre just stored as ASCII characters, as typed. There\(aqs no "string
+constant follows" token like there is in Atari BASIC (well, there is,
+it\(aqs just a double\-quote, $22. There\(aqs no length byte). Variable names
+are not tokenized, either, they\(aqre just stored as\-is (name in ASCII,
+including trailing $ for strings, etc). Numeric constants are just
+stored as ASCII digits, just as you typed them.
+.sp
+In fact the only things that are tokenized are BASIC keywords:
+commands and functions... NOT including user functions defined
+with DEF (those are stored as just the ASCII function name, like
+variables).
+.sp
+There are 2 sets of tokens. One set is single\-byte, $80 and up.
+These are commands. The other set is functions, which are 2 bytes:
+$FF followed by the token number. See amsbtok.h in the source for the
+actual tokens.
+.sp
+AMSB saves the end\-of\-line pointers, but it totally ignores them
+on LOAD. The SAVEd file format does \fInot\fP have a load address (as e.g.
+Commodore BASIC does), so there\(aqs no way to know the address of the
+start of the program (other than counting backwards from the next line,
+since its address is known). It\(aqs not just a constant either: it
+depends on what MEMLO was set to when the program was saved (which varies
+depending on what version of AMSB you have, what DOS you boot, whether
+or not you have the R: device driver loaded, etc etc).
+.SS Redundant Tokens
+.sp
+There are two separate tokens each for PRINT and AT:
+.TS
+center;
+|l|l|.
+_
+T{
+$ab
+T} T{
+PRINT
+T}
+_
+T{
+$ac
+T} T{
+PRINT
+T}
+_
+T{
+$df
+T} T{
+AT(
+T}
+_
+T{
+$e0
+T} T{
+AT
+T}
+_
+.TE
+.sp
+When tokenizing a line, AMSB will actually use the $ab token if
+there\(aqs a space after PRINT (or ?), otherwise it will use the
+$ac token. These lines actually get tokenized differently:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 PRINT "HELLO"
+10 PRINT"HELLO"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Same applies to the $df and $e0 AT tokens: if the user entered
+"AT(X,Y)", $df is used. Otherwise, with "AT (X,Y)", $e0 is used
+(followed by an ASCII left parenthesis).
+.sp
+3 tokens include the opening parenthesis:
+.TS
+center;
+|l|l|.
+_
+T{
+$d2
+T} T{
+TAB(
+T}
+_
+T{
+$d6
+T} T{
+SPC(
+T}
+_
+T{
+$df
+T} T{
+AT(
+T}
+_
+.TE
+.sp
+Normally in AMSB, it\(aqs OK to leave a space between a function name
+and the left\-paren. PEEK (123) and SIN (1) are both valid. However,
+for SPC and TAB, no space is allowed, because the ( is part of the
+token. AT would be the same way, except there\(aqs a separate token $e0
+that \fIincludes\fP the space. Weird, huh? A side effect of this is
+that "SPC (10)" or "TAB (10)" won\(aqt be treated as a function call.
+Instead, the SPC or TAB is treated as a variable name. If you write:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+PRINT TAB (10);"HELLO"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...it\(aqll print " 0 HELLO" at the start of the line[*], instead of "HELLO"
+in the 10th column as you might have expected. It also means that AT,
+TAB, and SPC are valid variable names in AMSB, which is an exception
+to the rule that keywords can\(aqt be used as variable names (e.g. SIN=1
+or STRING$="HELLO" are invalid).
+.sp
+[*] Unless you\(aqve assigned another value to TAB, of couse.
+.SS Unused Tokens
+.sp
+If you look at the token list in amsbtok.h (or in a hex dump
+of the AMSB executable or cartridge image), you\(aqll see a lot of
+double\-quotes mixed in with the list. AMSB doesn\(aqt actually tokenize
+the " character (it\(aqs stored as $22, its ASCII value), so these seem
+to be placeholders, either because some tokens were deleted from the
+language during its development, or else they\(aqre intended for some
+future version of AMSB that never happened.
+.sp
+The weird quote tokens are $99, $c8 to $d0, $d5, and $e7 to $ed. If
+you hexedit a program to replace a regular double\-quote with one of
+these tokens, it will list as either "" or just one ", but it will
+cause a syntax error at runtime.
+.SS LOADing Untokenized Files
+.sp
+If the first byte of the file is anything other than $00 or $01,
+AMSB\(aqs LOAD command reads it in as a text file (LISTed rather than
+SAVEd).
+.sp
+When LOAD is reading a text file, if the last byte of the file isn\(aqt
+an ATASCII EOL ($9b), you\(aqll get #136 ERROR. The program doesn\(aqt get
+deleted, but the last line of the file didn\(aqt get loaded. This could
+happen if a LISTed file somehow got truncated.
+.sp
+While on the subject... the manual doesn\(aqt mention it, but if you LOAD
+a text file without line numbers, the code gets executed in direct
+mode during the load (like Atari BASIC\(aqs ENTER command does). This
+means you could write scripts (batch files) for AMSB... though you\(aqd
+be better off using MERGE, rather than LOAD (MERGE is basically the
+same thing as Atari BASIC\(aqs ENTER).
+.SS Program Length Header Mismatch
+.sp
+When AMSB\(aqs LOAD command executes, it reads the 3\-byte header, then
+reads as many bytes as the header\(aqs program length says.
+.sp
+If the header length is longer than the rest of the file, you get
+a #136 ERROR (aka Atari\(aqs EOF), and the partially loaded program is
+erased (basically it does a NEW).
+.sp
+If the length is shorter than the program, it\(aqll stop loading no
+matter how much more data is in the file. This means it can stop in
+the middle of a line. It also means, if there was already a program in
+memory that was longer than the program length, you get a "hybrid" mix
+of the new program followed by the remainder of the old one. This is
+because the three $00 bytes at the end of the program weren\(aqt read in.
+.sp
+If the program length is correct for the actual program (so the three
+$00 bytes get read), but there\(aqs extra data appended to the file, AMSB
+will never read the extra data at all.
+.SS String Limitations
+.sp
+String literals in AMSB cannot contain the | or ATASCII heart
+characters.
+.sp
+AMSB uses | as a terminator for quoted strings, e.g. "STRING" will
+be tokenized as: "STRING|
+.sp
+If you try to use a | in a quoted string, it gets turned into a double
+quote: "FOO|BAR" comes out as "FOO"BAR which is a syntax error!
+.sp
+String variables can store | but only with e.g. CHR$(124) or reading
+from a file: it\(aqs string \fIliterals\fP that don\(aqt allow it.
+.sp
+The reason | is used for a terminating quote is to allow doubling up
+the quotes to embed them in a string:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+A$ = "HAS ""QUOTES"""
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+PRINT A$ will print: HAS "QUOTES"
+.sp
+At first I thought "no pipe characters in strings, WTF man?" but it\(aqs
+probably no worse than Atari BASIC\(aqs "no quotes in strings constants"
+rule. It \fIwould\fP be nice if the AMSB manual actually documented the
+fact that | can\(aqt occur in a string constant. Not documenting it makes
+it a bug... and they have unused tokens in the $Fx range, I don\(aqt see
+why they had to use a printing character for this.
+.sp
+You also can\(aqt put a heart (ATASCII character 0) in a string
+literal. It will be treated as the end of the line, as though you
+pressed Enter (and anything else on the line is ignored). This isn\(aqt
+documented in the manual, either.
+.sp
+Like the | character, you can use CHR$(0) to store a heart in a string
+and it will work correctly.
+.SS Line Number Range
+.sp
+AMSB doesn\(aqt allow entering line numbers above 63999, but if a file
+is e.g. hex\-edited to have a line number that\(aqs out of range, it will
+LIST and RUN just fine... except that it\(aqs impossible to GOTO or GOSUB
+to an out\-of\-range line. It will still execute if program flow falls
+into it.
+.SS Differences Between Versions
+.sp
+The language is the same in AMSB versions 1 and 2. Tokenized files
+made by one version will LOAD and RUN in the other version.
+.sp
+Version 1, the disk version, always has the full set of commands
+avaiable. Version 2, the cart, only has the full set if the extension
+disk is booted. The missing ones still get tokenized, but you get SN
+ERROR at runtime if you try to execute them. This doesn\(aqt affect the
+detokenizer at all. The missing commands:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+AUTO
+DEF (string version only)
+NOTE
+RENUM
+TRON
+TROFF
+DEL
+USING
+STRING$ (function)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+RENUM only works in direct mode, not a program. Executing it
+gives a FUNCTION CALL ERROR.
+.sp
+AUTO is (oddly) allowed in a program. Executing it exits the program
+and puts you back in the editor, in auto\-numbering mode.
+.sp
+It would seem weird to have POINT available but not NOTE... except
+that AMSB doesn\(aqt even \fIhave\fP POINT. Instead, the disk addresses
+returned by NOTE are used with AT() in a PRINT statement. Not sure
+if AT() works without the extensions loaded, but it won\(aqt be useful
+anyway without NOTE.
+.sp
+One other difference between versions 1 and 2: version 2 will LOAD and
+RUN the file D:AUTORUN.AMB at startup, if it exists.
+.SS Colon Weirdness
+.sp
+AMSB allows comments to be started with the ! and \(aq characters (as
+well as the traditional REM). For the ! and \(aq variety, if they
+come at the end of a line after some code, you don\(aqt have to put a colon.
+Example:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 GRAPHICS 2+16 ! NO TEXT
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+However... in the tokenized format, there \fIis\fP a tokenized colon
+just before the tokenized ! or \(aq character. LIST doesn\(aqt display it.
+If you did put a colon:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 CLOSE #1:! WE\(aqRE DONE
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...then there will be \fItwo\fP colons in the tokenized file, and only
+one will be LISTed.
+.sp
+The ELSE keyword works the same way. In this line:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 IF A THEN PRINT ELSE STOP
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...there is actually a : character just before the token for ELSE.
+.sp
+Even weirder: you can put as many colons in a row as you like, and
+AMSB will treat it like single colon. This line of code is valid
+and runs correctly:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 PRINT "A"::::::PRINT "A"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+These colons are displayed normally in LIST output.
+.SS Memory Usage
+.sp
+On a 48K/64K Atari, FRE(0) for AMSB 1 with DOS booted (since you can\(aqt
+use it without) but no device drivers is 21020. MEMLO is awfully high
+($6a00).
+.sp
+For AMSB 2 with DOS booted, but without the extensions loaded, FRE(0)
+is 24352. With extensions it\(aqs 20642 (even though the banner says 20644
+BYTES FREE).
+.sp
+AMSB 2 without DOS gives you 29980, but how are you gonna load or save
+programs without DOS? Nobody wants to use cassette, especially not
+people who could afford to buy the AMSB II cartridge.
+.SS LOCKed Programs
+.sp
+If you save a program with SAVE "filename" LOCK, it gets saved in an
+"encrypted" form. Loading a locked program disables the LISTing or
+editing the program (you get LK ERROR if you try).
+.sp
+The "encryption" is no better than ROT13. To encrypt, subtract each
+byte from 0x54 (in an 8\-bit register, using twos complement). To
+decrypt, do the same. This is a reciprocal cipher, and you can think
+of it as the binary equivalent of ROT13.
+.sp
+You can tell a LOCKed program because its first byte will be 1 instead
+of 0. The next 2 bytes (the program length) unencrypted. The rest of
+the file is encrypted with the lame scheme described above.
+.sp
+When AMSB has a LOCKed program loaded into memory, it\(aqs \fInot\fP stored
+encrypted in RAM. It would be perfectly possible to write BASIC code
+using direct mode to write the tokenized program out to disk. The
+program starts at MEMLO and extends up to the first occurrence of
+three $00 bytes. The hardest part of this would be generating the
+header using only direct\-mode BASIC statements (but it could be done).
+.sp
+However... there\(aqs no need to do that. AMSB has a flag that tells it
+whether or not the currently\-loaded program is LOCKed. You can just
+clear the flag:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+POKE 168,0
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Now AMSB won\(aqt consider the program LOCKed, and you can SAVE a regular
+copy of it (and LIST, edit, etc).
+.SS Line Length Limit
+.sp
+In the editor, after a POKE 82,0 (to set the left margin to 0), you
+can enter 120 characters (3 screen lines) on a logical line. If you
+enter a program line that way \fIwithout\fP a space after the line number,
+then LIST it, it will be 121 characters long, because AMSB will
+display a space after the line number.
+.sp
+If you use a text editor (or write a program) to create an untokenized
+BASIC program, you can have a line of code that\(aqs 125 characters
+long. AMSB will accept it just fine, with LOAD. If a line is 126
+characters or longer, AMSB will silently ignore that line when
+LOADing.
+.sp
+If you create a 125\-character line (with a text editor) consisting
+only of a comment that begins with ! or \(aq, without a space after the
+line number, LOAD it, then SAVE it, that line will be 129 bytes long
+in tokenized form. AMSB will LOAD it with no problems.
+.sp
+If you hex\-edit a SAVEd file to create a longer line, AMSB will
+accept that, too... up to 255 bytes. At 256 bytes, AMSB will lock
+up after LOAD.
+.SS Crunching
+.sp
+AMSB stores spaces in the tokenized program, just like other 8\-bit
+MS BASICs do, but it requires you to put spaces between keywords and
+variables (unlike e.g. Commodore 64 BASIC). This seems to be because
+AMSB allows keywords inside of variable names: you can have a variable
+called LIFE (which contains the keyword IF) in AMSB, but you can\(aqt in
+C=64 BASIC (which gives a syntax error becase it sees "L IF E").
+.sp
+This applies to numbers, too: POKE710,0 is a syntax error in
+AMSB. This is because POKE710 is actually a valid variable name: try
+POKE710=123 followed by PRINT POKE710.
+.sp
+However. The spaces aren\(aqt needed when the program is RUN. It would be
+possible to remove all the spaces outside of strings or comments and
+the program would still work fine.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/amsb.rst b/amsb.rst
new file mode 100644
index 0000000..19557ee
--- /dev/null
+++ b/amsb.rst
@@ -0,0 +1,13 @@
+====
+amsb
+====
+
+---------------------------
+Atari Microsoft BASIC Notes
+---------------------------
+
+.. include:: manhdr7.rst
+
+.. include:: amsb_content.rst
+
+.. include:: manftr.rst
diff --git a/amsb40.rst b/amsb40.rst
new file mode 100644
index 0000000..6998211
--- /dev/null
+++ b/amsb40.rst
@@ -0,0 +1,31 @@
+====
+amsb
+====
+
+--------------------
+Atari MS BASIC Notes
+--------------------
+
+.. include:: ver.rst
+.. |date| date::
+
+:Manual section: 7
+:Manual group: Urchlay
+:Date: |date|
+:Version: |version|
+
+.. include:: amsb_content.rst
+
+COPYRIGHT
+=========
+
+WTFPL. See http://www.wtfpl.net/txt/copying for details.
+
+AUTHOR
+======
+
+B. Watson
+
+Email: urchlay@slackware.uk
+
+IRC: Urchlay on irc.libera.chat *##atari*.
diff --git a/amsb40.txt b/amsb40.txt
new file mode 100644
index 0000000..5c6f537
--- /dev/null
+++ b/amsb40.txt
@@ -0,0 +1,668 @@
+AMSB(7) Urchlay AMSB(7)
+
+NAME
+ amsb - Atari MS BASIC Notes
+
+DESCRIPTION
+ Atari Microsoft BASIC is actu-
+ ally a pretty cool BASIC for
+ the Atari 8-bit. I never got
+ the chance to use it 'back in
+ the day' because it was expen-
+ sive, required a floppy drive
+ and at least 32K of RAM (my
+ poor 400 had a tape drive for
+ the first few years), and then
+ later on, there was Turbo BASIC
+ XL, which was cooler than AMSB,
+ and also freeware.
+
+ This file is a collection of
+ notes I made to myself while
+ developing listamsb. The infor-
+ mation here might be useful
+ (e.g. if you're trying to re-
+ pair a damaged AMSB file) and
+ hopefully is interesting. En-
+ joy!
+
+ This file is part of the
+ bw-atari8-utils source. You can
+ get the latest version of the
+ source from:
+
+ https://slackware.uk/~urchlay/repos/bw-atari8-tools
+
+ ...which you can either view
+ with a web browser or use with
+ the 'git clone' command.
+
+NOTES
+ Tokenized file format
+ File begins with a 3-byte
+ header:
+
+ +-------+---------------+
+ |Offset | Purpose |
+ +-------+---------------+
+ |0 | 0 for a nor- |
+ | | mal program, |
+ | | 1 for LOCKed |
+ | | (encrypted) |
+ +-------+---------------+
+ |1 | LSB, program |
+ | | length, not |
+ | | counting the |
+ | | 3-byte header |
+ +-------+---------------+
+ |2 | MSB, program |
+ | | length |
+ +-------+---------------+
+
+ The program length should al-
+ ways be the actual file size
+ minus 3. If it's not, the file
+ has either been truncated or
+ had junk added to the end. In a
+ LOCKed program, the program
+ length bytes are not encrypted.
+
+ After the header, the lines of
+ code (encrypted, for LOCKed
+ programs). Each line has a
+ 4-byte header:
+
+ +--+--------------+
+ |0 | LSB, address |
+ | | of the last |
+ | | byte of this |
+ | | line... |
+ +--+--------------+
+ |1 | MSB, address |
+ | | ...which is |
+ | | ignored on |
+ | | LOAD! |
+ +--+--------------+
+ |2 | LSB, line |
+ | | number |
+ +--+--------------+
+ |3 | MSB, line |
+ | | number |
+ +--+--------------+
+
+ The rest of the line is the to-
+ kens, terminated by a $00 byte.
+ The next 2 bytes after the $00
+ is the last-byte offset of the
+ next line.
+
+ The last "line" of the program
+ has a $0000 offset, which indi-
+ cates the end of the program.
+ Since the actual last line ends
+ with a $00, that means there
+ will be three $00 bytes in a
+ row as the last 3 bytes of the
+ file. And that's the only place
+ 3 $00's in a row will occur.
+
+ Tokenization is "lightweight":
+ there are no tokenized numer-
+ ics, they're just stored as
+ ASCII characters, as typed.
+ There's no "string constant
+ follows" token like there is in
+ Atari BASIC (well, there is,
+ it's just a double-quote, $22.
+ There's no length byte). Vari-
+ able names are not tokenized,
+ either, they're just stored
+ as-is (name in ASCII, including
+ trailing $ for strings, etc).
+ Numeric constants are just
+ stored as ASCII digits, just as
+ you typed them.
+
+ In fact the only things that
+ are tokenized are BASIC key-
+ words: commands and func-
+ tions... NOT including user
+ functions defined with DEF
+ (those are stored as just the
+ ASCII function name, like vari-
+ ables).
+
+ There are 2 sets of tokens. One
+ set is single-byte, $80 and up.
+ These are commands. The other
+ set is functions, which are 2
+ bytes: $FF followed by the to-
+ ken number. See amsbtok.h in
+ the source for the actual to-
+ kens.
+
+ AMSB saves the end-of-line
+ pointers, but it totally ig-
+ nores them on LOAD. The SAVEd
+ file format does not have a
+ load address (as e.g. Com-
+ modore BASIC does), so there's
+ no way to know the address of
+ the start of the program (other
+ than counting backwards from
+ the next line, since its ad-
+ dress is known). It's not just
+ a constant either: it depends
+ on what MEMLO was set to when
+ the program was saved (which
+ varies depending on what ver-
+ sion of AMSB you have, what DOS
+ you boot, whether or not you
+ have the R: device driver
+ loaded, etc etc).
+
+ Redundant Tokens
+ There are two separate tokens
+ each for PRINT and AT:
+
+ +----+-------+
+ |$ab | PRINT |
+ +----+-------+
+ |$ac | PRINT |
+ +----+-------+
+ |$df | AT( |
+ +----+-------+
+ |$e0 | AT |
+ +----+-------+
+
+ When tokenizing a line, AMSB
+ will actually use the $ab token
+ if there's a space after PRINT
+ (or ?), otherwise it will use
+ the $ac token. These lines ac-
+ tually get tokenized differ-
+ ently:
+
+ 10 PRINT "HELLO"
+ 10 PRINT"HELLO"
+
+ Same applies to the $df and $e0
+ AT tokens: if the user entered
+ "AT(X,Y)", $df is used. Other-
+ wise, with "AT (X,Y)", $e0 is
+ used (followed by an ASCII left
+ parenthesis).
+
+ 3 tokens include the opening
+ parenthesis:
+
+ +----+------+
+ |$d2 | TAB( |
+ +----+------+
+ |$d6 | SPC( |
+ +----+------+
+ |$df | AT( |
+ +----+------+
+
+ Normally in AMSB, it's OK to
+ leave a space between a func-
+ tion name and the left-paren.
+ PEEK (123) and SIN (1) are both
+ valid. However, for SPC and
+ TAB, no space is allowed, be-
+ cause the ( is part of the to-
+ ken. AT would be the same way,
+ except there's a separate token
+ $e0 that includes the space.
+ Weird, huh? A side effect of
+ this is that "SPC (10)" or "TAB
+ (10)" won't be treated as a
+ function call. Instead, the
+ SPC or TAB is treated as a
+ variable name. If you write:
+
+ PRINT TAB (10);"HELLO"
+
+ ...it'll print " 0 HELLO" at
+ the start of the line[*], in-
+ stead of "HELLO" in the 10th
+ column as you might have ex-
+ pected. It also means that AT,
+ TAB, and SPC are valid variable
+ names in AMSB, which is an ex-
+ ception to the rule that key-
+ words can't be used as variable
+ names (e.g. SIN=1 or
+ STRING$="HELLO" are invalid).
+
+ [*] Unless you've assigned an-
+ other value to TAB, of couse.
+
+ Unused Tokens
+ If you look at the token list
+ in amsbtok.h (or in a hex dump
+ of the AMSB executable or car-
+ tridge image), you'll see a lot
+ of double-quotes mixed in with
+ the list. AMSB doesn't actually
+ tokenize the " character (it's
+ stored as $22, its ASCII
+ value), so these seem to be
+ placeholders, either because
+ some tokens were deleted from
+ the language during its devel-
+ opment, or else they're in-
+ tended for some future version
+ of AMSB that never happened.
+
+ The weird quote tokens are $99,
+ $c8 to $d0, $d5, and $e7 to
+ $ed. If you hexedit a program
+ to replace a regular dou-
+ ble-quote with one of these to-
+ kens, it will list as either ""
+ or just one ", but it will
+ cause a syntax error at run-
+ time.
+
+ LOADing Untokenized Files
+ If the first byte of the file
+ is anything other than $00 or
+ $01, AMSB's LOAD command reads
+ it in as a text file (LISTed
+ rather than SAVEd).
+
+ When LOAD is reading a text
+ file, if the last byte of the
+ file isn't an ATASCII EOL
+ ($9b), you'll get #136 ERROR.
+ The program doesn't get
+ deleted, but the last line of
+ the file didn't get loaded.
+ This could happen if a LISTed
+ file somehow got truncated.
+
+ While on the subject... the
+ manual doesn't mention it, but
+ if you LOAD a text file without
+ line numbers, the code gets ex-
+ ecuted in direct mode during
+ the load (like Atari BASIC's
+ ENTER command does). This means
+ you could write scripts (batch
+ files) for AMSB... though you'd
+ be better off using MERGE,
+ rather than LOAD (MERGE is ba-
+ sically the same thing as Atari
+ BASIC's ENTER).
+
+ Program Length Header Mismatch
+ When AMSB's LOAD command exe-
+ cutes, it reads the 3-byte
+ header, then reads as many
+ bytes as the header's program
+ length says.
+
+ If the header length is longer
+ than the rest of the file, you
+ get a #136 ERROR (aka Atari's
+ EOF), and the partially loaded
+ program is erased (basically it
+ does a NEW).
+
+ If the length is shorter than
+ the program, it'll stop loading
+ no matter how much more data is
+ in the file. This means it can
+ stop in the middle of a line.
+ It also means, if there was al-
+ ready a program in memory that
+ was longer than the program
+ length, you get a "hybrid" mix
+ of the new program followed by
+ the remainder of the old one.
+ This is because the three $00
+ bytes at the end of the program
+ weren't read in.
+
+ If the program length is cor-
+ rect for the actual program (so
+ the three $00 bytes get read),
+ but there's extra data appended
+ to the file, AMSB will never
+ read the extra data at all.
+
+ String Limitations
+ String literals in AMSB cannot
+ contain the | or ATASCII heart
+ characters.
+
+ AMSB uses | as a terminator for
+ quoted strings, e.g. "STRING"
+ will be tokenized as: "STRING|
+
+ If you try to use a | in a
+ quoted string, it gets turned
+ into a double quote: "FOO|BAR"
+ comes out as "FOO"BAR which is
+ a syntax error!
+
+ String variables can store |
+ but only with e.g. CHR$(124) or
+ reading from a file: it's
+ string literals that don't al-
+ low it.
+
+ The reason | is used for a ter-
+ minating quote is to allow dou-
+ bling up the quotes to embed
+ them in a string:
+
+ A$ = "HAS ""QUOTES"""
+
+ PRINT A$ will print: HAS
+ "QUOTES"
+
+ At first I thought "no pipe
+ characters in strings, WTF
+ man?" but it's probably no
+ worse than Atari BASIC's "no
+ quotes in strings constants"
+ rule. It would be nice if the
+ AMSB manual actually documented
+ the fact that | can't occur in
+ a string constant. Not docu-
+ menting it makes it a bug...
+ and they have unused tokens in
+ the $Fx range, I don't see why
+ they had to use a printing
+ character for this.
+
+ You also can't put a heart
+ (ATASCII character 0) in a
+ string literal. It will be
+ treated as the end of the line,
+ as though you pressed Enter
+ (and anything else on the line
+ is ignored). This isn't docu-
+ mented in the manual, either.
+
+ Like the | character, you can
+ use CHR$(0) to store a heart in
+ a string and it will work cor-
+ rectly.
+
+ Line Number Range
+ AMSB doesn't allow entering
+ line numbers above 63999, but
+ if a file is e.g. hex-edited to
+ have a line number that's out
+ of range, it will LIST and RUN
+ just fine... except that it's
+ impossible to GOTO or GOSUB to
+ an out-of-range line. It will
+ still execute if program flow
+ falls into it.
+
+ Differences Between Versions
+ The language is the same in
+ AMSB versions 1 and 2. Tok-
+ enized files made by one ver-
+ sion will LOAD and RUN in the
+ other version.
+
+ Version 1, the disk version,
+ always has the full set of com-
+ mands avaiable. Version 2, the
+ cart, only has the full set if
+ the extension disk is booted.
+ The missing ones still get tok-
+ enized, but you get SN ERROR at
+ runtime if you try to execute
+ them. This doesn't affect the
+ detokenizer at all. The missing
+ commands:
+
+ AUTO
+ DEF (string version only)
+ NOTE
+ RENUM
+ TRON
+ TROFF
+ DEL
+ USING
+ STRING$ (function)
+
+ RENUM only works in direct
+ mode, not a program. Executing
+ it gives a FUNCTION CALL ERROR.
+
+ AUTO is (oddly) allowed in a
+ program. Executing it exits the
+ program and puts you back in
+ the editor, in auto-numbering
+ mode.
+
+ It would seem weird to have
+ POINT available but not NOTE...
+ except that AMSB doesn't even
+ have POINT. Instead, the disk
+ addresses returned by NOTE are
+ used with AT() in a PRINT
+ statement. Not sure if AT()
+ works without the extensions
+ loaded, but it won't be useful
+ anyway without NOTE.
+
+ One other difference between
+ versions 1 and 2: version 2
+ will LOAD and RUN the file
+ D:AUTORUN.AMB at startup, if it
+ exists.
+
+ Colon Weirdness
+ AMSB allows comments to be
+ started with the ! and ' char-
+ acters (as well as the tradi-
+ tional REM). For the ! and '
+ variety, if they come at the
+ end of a line after some code,
+ you don't have to put a colon.
+ Example:
+
+ 10 GRAPHICS 2+16 ! NO TEXT
+
+ However... in the tokenized
+ format, there is a tokenized
+ colon just before the tokenized
+ ! or ' character. LIST doesn't
+ display it. If you did put a
+ colon:
+
+ 10 CLOSE #1:! WE'RE DONE
+
+ ...then there will be two
+ colons in the tokenized file,
+ and only one will be LISTed.
+
+ The ELSE keyword works the same
+ way. In this line:
+
+ 10 IF A THEN PRINT ELSE STOP
+
+ ...there is actually a : char-
+ acter just before the token for
+ ELSE.
+
+ Even weirder: you can put as
+ many colons in a row as you
+ like, and AMSB will treat it
+ like single colon. This line of
+ code is valid and runs cor-
+ rectly:
+
+ 10 PRINT "A"::::::PRINT "A"
+
+ These colons are displayed nor-
+ mally in LIST output.
+
+ Memory Usage
+ On a 48K/64K Atari, FRE(0) for
+ AMSB 1 with DOS booted (since
+ you can't use it without) but
+ no device drivers is 21020.
+ MEMLO is awfully high ($6a00).
+
+ For AMSB 2 with DOS booted, but
+ without the extensions loaded,
+ FRE(0) is 24352. With exten-
+ sions it's 20642 (even though
+ the banner says 20644 BYTES
+ FREE).
+
+ AMSB 2 without DOS gives you
+ 29980, but how are you gonna
+ load or save programs without
+ DOS? Nobody wants to use cas-
+ sette, especially not people
+ who could afford to buy the
+ AMSB II cartridge.
+
+ LOCKed Programs
+ If you save a program with SAVE
+ "filename" LOCK, it gets saved
+ in an "encrypted" form. Loading
+ a locked program disables the
+ LISTing or editing the program
+ (you get LK ERROR if you try).
+
+ The "encryption" is no better
+ than ROT13. To encrypt, sub-
+ tract each byte from 0x54 (in
+ an 8-bit register, using twos
+ complement). To decrypt, do the
+ same. This is a reciprocal ci-
+ pher, and you can think of it
+ as the binary equivalent of
+ ROT13.
+
+ You can tell a LOCKed program
+ because its first byte will be
+ 1 instead of 0. The next 2
+ bytes (the program length) un-
+ encrypted. The rest of the file
+ is encrypted with the lame
+ scheme described above.
+
+ When AMSB has a LOCKed program
+ loaded into memory, it's not
+ stored encrypted in RAM. It
+ would be perfectly possible to
+ write BASIC code using direct
+ mode to write the tokenized
+ program out to disk. The pro-
+ gram starts at MEMLO and ex-
+ tends up to the first occur-
+ rence of three $00 bytes. The
+ hardest part of this would be
+ generating the header using
+ only direct-mode BASIC state-
+ ments (but it could be done).
+
+ However... there's no need to
+ do that. AMSB has a flag that
+ tells it whether or not the
+ currently-loaded program is
+ LOCKed. You can just clear the
+ flag:
+
+ POKE 168,0
+
+ Now AMSB won't consider the
+ program LOCKed, and you can
+ SAVE a regular copy of it (and
+ LIST, edit, etc).
+
+ Line Length Limit
+ In the editor, after a POKE
+ 82,0 (to set the left margin to
+ 0), you can enter 120 charac-
+ ters (3 screen lines) on a log-
+ ical line. If you enter a pro-
+ gram line that way without a
+ space after the line number,
+ then LIST it, it will be 121
+ characters long, because AMSB
+ will display a space after the
+ line number.
+
+ If you use a text editor (or
+ write a program) to create an
+ untokenized BASIC program, you
+ can have a line of code that's
+ 125 characters long. AMSB will
+ accept it just fine, with LOAD.
+ If a line is 126 characters or
+ longer, AMSB will silently ig-
+ nore that line when LOADing.
+
+ If you create a 125-character
+ line (with a text editor) con-
+ sisting only of a comment that
+ begins with ! or ', without a
+ space after the line number,
+ LOAD it, then SAVE it, that
+ line will be 129 bytes long in
+ tokenized form. AMSB will LOAD
+ it with no problems.
+
+ If you hex-edit a SAVEd file to
+ create a longer line, AMSB will
+ accept that, too... up to 255
+ bytes. At 256 bytes, AMSB will
+ lock up after LOAD.
+
+ Crunching
+ AMSB stores spaces in the tok-
+ enized program, just like other
+ 8-bit MS BASICs do, but it re-
+ quires you to put spaces be-
+ tween keywords and variables
+ (unlike e.g. Commodore 64 BA-
+ SIC). This seems to be because
+ AMSB allows keywords inside of
+ variable names: you can have a
+ variable called LIFE (which
+ contains the keyword IF) in
+ AMSB, but you can't in C=64 BA-
+ SIC (which gives a syntax error
+ becase it sees "L IF E").
+
+ This applies to numbers, too:
+ POKE710,0 is a syntax error in
+ AMSB. This is because POKE710
+ is actually a valid variable
+ name: try POKE710=123 followed
+ by PRINT POKE710.
+
+ However. The spaces aren't
+ needed when the program is RUN.
+ It would be possible to remove
+ all the spaces outside of
+ strings or comments and the
+ program would still work fine.
+
+COPYRIGHT
+ WTFPL. See
+ http://www.wtfpl.net/txt/copying
+ for details.
+
+AUTHOR
+ B. Watson
+
+ Email: urchlay@slackware.uk
+
+ IRC: Urchlay on irc.libera.chat
+ ##atari.
+
+0.2.2 2025-03-13 AMSB(7)
diff --git a/amsb_content.rst b/amsb_content.rst
new file mode 100644
index 0000000..51cbb25
--- /dev/null
+++ b/amsb_content.rst
@@ -0,0 +1,406 @@
+DESCRIPTION
+===========
+
+Atari Microsoft BASIC is actually a pretty cool BASIC for the Atari 8-bit. I never
+got the chance to use it 'back in the day' because it was expensive,
+required a floppy drive and at least 32K of RAM (my poor 400 had a
+tape drive for the first few years), and then later on, there was
+Turbo BASIC XL, which was cooler than AMSB, and also freeware.
+
+This file is a collection of notes I made to myself while developing
+listamsb. The information here might be useful (e.g. if you're trying
+to repair a damaged AMSB file) and hopefully is interesting. Enjoy!
+
+This file is part of the bw-atari8-utils source. You can get the
+latest version of the source from:
+
+https://slackware.uk/~urchlay/repos/bw-atari8-tools
+
+...which you can either view with a web browser or use with the 'git
+clone' command.
+
+NOTES
+=====
+
+Tokenized file format
+---------------------
+
+File begins with a 3-byte header:
+
+.. csv-table::
+
+ "Offset", "Purpose"
+ "0", "0 for a normal program, 1 for LOCKed (encrypted)"
+ "1", "LSB, program length, not counting the 3-byte header"
+ "2", "MSB, program length"
+
+The program length should always be the actual file size minus 3. If
+it's not, the file has either been truncated or had junk added to the
+end. In a LOCKed program, the program length bytes are not encrypted.
+
+After the header, the lines of code (encrypted, for LOCKed programs).
+Each line has a 4-byte header:
+
+.. csv-table::
+
+ "0", "LSB, address of the last byte of this line..."
+ "1", "MSB, address ...which is ignored on LOAD!"
+ "2", "LSB, line number"
+ "3", "MSB, line number"
+
+The rest of the line is the tokens, terminated by a $00 byte. The
+next 2 bytes after the $00 is the last-byte offset of the next line.
+
+The last "line" of the program has a $0000 offset, which indicates the
+end of the program. Since the actual last line ends with a $00, that
+means there will be three $00 bytes in a row as the last 3 bytes of
+the file. And that's the *only* place 3 $00's in a row will occur.
+
+Tokenization is "lightweight": there are no tokenized numerics,
+they're just stored as ASCII characters, as typed. There's no "string
+constant follows" token like there is in Atari BASIC (well, there is,
+it's just a double-quote, $22. There's no length byte). Variable names
+are not tokenized, either, they're just stored as-is (name in ASCII,
+including trailing $ for strings, etc). Numeric constants are just
+stored as ASCII digits, just as you typed them.
+
+In fact the only things that are tokenized are BASIC keywords:
+commands and functions... NOT including user functions defined
+with DEF (those are stored as just the ASCII function name, like
+variables).
+
+There are 2 sets of tokens. One set is single-byte, $80 and up.
+These are commands. The other set is functions, which are 2 bytes:
+$FF followed by the token number. See amsbtok.h in the source for the
+actual tokens.
+
+AMSB saves the end-of-line pointers, but it totally ignores them
+on LOAD. The SAVEd file format does *not* have a load address (as e.g.
+Commodore BASIC does), so there's no way to know the address of the
+start of the program (other than counting backwards from the next line,
+since its address is known). It's not just a constant either: it
+depends on what MEMLO was set to when the program was saved (which varies
+depending on what version of AMSB you have, what DOS you boot, whether
+or not you have the R: device driver loaded, etc etc).
+
+
+Redundant Tokens
+----------------
+
+There are two separate tokens each for PRINT and AT:
+
+.. csv-table::
+
+ "$ab", "PRINT "
+ "$ac", "PRINT"
+ "$df", "AT("
+ "$e0", "AT "
+
+When tokenizing a line, AMSB will actually use the $ab token if
+there's a space after PRINT (or ?), otherwise it will use the
+$ac token. These lines actually get tokenized differently::
+
+ 10 PRINT "HELLO"
+ 10 PRINT"HELLO"
+
+Same applies to the $df and $e0 AT tokens: if the user entered
+"AT(X,Y)", $df is used. Otherwise, with "AT (X,Y)", $e0 is used
+(followed by an ASCII left parenthesis).
+
+3 tokens include the opening parenthesis:
+
+.. csv-table::
+
+ "$d2", "TAB("
+ "$d6", "SPC("
+ "$df", "AT("
+
+Normally in AMSB, it's OK to leave a space between a function name
+and the left-paren. PEEK (123) and SIN (1) are both valid. However,
+for SPC and TAB, no space is allowed, because the ( is part of the
+token. AT would be the same way, except there's a separate token $e0
+that *includes* the space. Weird, huh? A side effect of this is
+that "SPC (10)" or "TAB (10)" won't be treated as a function call.
+Instead, the SPC or TAB is treated as a variable name. If you write::
+
+ PRINT TAB (10);"HELLO"
+
+...it'll print " 0 HELLO" at the start of the line[*], instead of "HELLO"
+in the 10th column as you might have expected. It also means that AT,
+TAB, and SPC are valid variable names in AMSB, which is an exception
+to the rule that keywords can't be used as variable names (e.g. SIN=1
+or STRING$="HELLO" are invalid).
+
+[*] Unless you've assigned another value to TAB, of couse.
+
+
+Unused Tokens
+-------------
+
+If you look at the token list in amsbtok.h (or in a hex dump
+of the AMSB executable or cartridge image), you'll see a lot of
+double-quotes mixed in with the list. AMSB doesn't actually tokenize
+the " character (it's stored as $22, its ASCII value), so these seem
+to be placeholders, either because some tokens were deleted from the
+language during its development, or else they're intended for some
+future version of AMSB that never happened.
+
+The weird quote tokens are $99, $c8 to $d0, $d5, and $e7 to $ed. If
+you hexedit a program to replace a regular double-quote with one of
+these tokens, it will list as either "" or just one ", but it will
+cause a syntax error at runtime.
+
+
+LOADing Untokenized Files
+-------------------------
+
+If the first byte of the file is anything other than $00 or $01,
+AMSB's LOAD command reads it in as a text file (LISTed rather than
+SAVEd).
+
+When LOAD is reading a text file, if the last byte of the file isn't
+an ATASCII EOL ($9b), you'll get #136 ERROR. The program doesn't get
+deleted, but the last line of the file didn't get loaded. This could
+happen if a LISTed file somehow got truncated.
+
+While on the subject... the manual doesn't mention it, but if you LOAD
+a text file without line numbers, the code gets executed in direct
+mode during the load (like Atari BASIC's ENTER command does). This
+means you could write scripts (batch files) for AMSB... though you'd
+be better off using MERGE, rather than LOAD (MERGE is basically the
+same thing as Atari BASIC's ENTER).
+
+
+Program Length Header Mismatch
+------------------------------
+
+When AMSB's LOAD command executes, it reads the 3-byte header, then
+reads as many bytes as the header's program length says.
+
+If the header length is longer than the rest of the file, you get
+a #136 ERROR (aka Atari's EOF), and the partially loaded program is
+erased (basically it does a NEW).
+
+If the length is shorter than the program, it'll stop loading no
+matter how much more data is in the file. This means it can stop in
+the middle of a line. It also means, if there was already a program in
+memory that was longer than the program length, you get a "hybrid" mix
+of the new program followed by the remainder of the old one. This is
+because the three $00 bytes at the end of the program weren't read in.
+
+If the program length is correct for the actual program (so the three
+$00 bytes get read), but there's extra data appended to the file, AMSB
+will never read the extra data at all.
+
+
+String Limitations
+------------------
+
+String literals in AMSB cannot contain the | or ATASCII heart
+characters.
+
+AMSB uses | as a terminator for quoted strings, e.g. "STRING" will
+be tokenized as: "STRING|
+
+If you try to use a | in a quoted string, it gets turned into a double
+quote: "FOO|BAR" comes out as "FOO"BAR which is a syntax error!
+
+String variables can store | but only with e.g. CHR$(124) or reading
+from a file: it's string *literals* that don't allow it.
+
+The reason | is used for a terminating quote is to allow doubling up
+the quotes to embed them in a string::
+
+ A$ = "HAS ""QUOTES"""
+
+PRINT A$ will print: HAS "QUOTES"
+
+At first I thought "no pipe characters in strings, WTF man?" but it's
+probably no worse than Atari BASIC's "no quotes in strings constants"
+rule. It *would* be nice if the AMSB manual actually documented the
+fact that | can't occur in a string constant. Not documenting it makes
+it a bug... and they have unused tokens in the $Fx range, I don't see
+why they had to use a printing character for this.
+
+You also can't put a heart (ATASCII character 0) in a string
+literal. It will be treated as the end of the line, as though you
+pressed Enter (and anything else on the line is ignored). This isn't
+documented in the manual, either.
+
+Like the | character, you can use CHR$(0) to store a heart in a string
+and it will work correctly.
+
+
+Line Number Range
+-----------------
+
+AMSB doesn't allow entering line numbers above 63999, but if a file
+is e.g. hex-edited to have a line number that's out of range, it will
+LIST and RUN just fine... except that it's impossible to GOTO or GOSUB
+to an out-of-range line. It will still execute if program flow falls
+into it.
+
+
+Differences Between Versions
+----------------------------
+
+The language is the same in AMSB versions 1 and 2. Tokenized files
+made by one version will LOAD and RUN in the other version.
+
+Version 1, the disk version, always has the full set of commands
+avaiable. Version 2, the cart, only has the full set if the extension
+disk is booted. The missing ones still get tokenized, but you get SN
+ERROR at runtime if you try to execute them. This doesn't affect the
+detokenizer at all. The missing commands::
+
+ AUTO
+ DEF (string version only)
+ NOTE
+ RENUM
+ TRON
+ TROFF
+ DEL
+ USING
+ STRING$ (function)
+
+RENUM only works in direct mode, not a program. Executing it
+gives a FUNCTION CALL ERROR.
+
+AUTO is (oddly) allowed in a program. Executing it exits the program
+and puts you back in the editor, in auto-numbering mode.
+
+It would seem weird to have POINT available but not NOTE... except
+that AMSB doesn't even *have* POINT. Instead, the disk addresses
+returned by NOTE are used with AT() in a PRINT statement. Not sure
+if AT() works without the extensions loaded, but it won't be useful
+anyway without NOTE.
+
+One other difference between versions 1 and 2: version 2 will LOAD and
+RUN the file D:AUTORUN.AMB at startup, if it exists.
+
+
+Colon Weirdness
+---------------
+
+AMSB allows comments to be started with the ! and ' characters (as
+well as the traditional REM). For the ! and ' variety, if they
+come at the end of a line after some code, you don't have to put a colon.
+Example::
+
+ 10 GRAPHICS 2+16 ! NO TEXT
+
+However... in the tokenized format, there *is* a tokenized colon
+just before the tokenized ! or ' character. LIST doesn't display it.
+If you did put a colon::
+
+ 10 CLOSE #1:! WE'RE DONE
+
+...then there will be *two* colons in the tokenized file, and only
+one will be LISTed.
+
+The ELSE keyword works the same way. In this line::
+
+ 10 IF A THEN PRINT ELSE STOP
+
+...there is actually a : character just before the token for ELSE.
+
+Even weirder: you can put as many colons in a row as you like, and
+AMSB will treat it like single colon. This line of code is valid
+and runs correctly::
+
+ 10 PRINT "A"::::::PRINT "A"
+
+These colons are displayed normally in LIST output.
+
+
+Memory Usage
+------------
+
+On a 48K/64K Atari, FRE(0) for AMSB 1 with DOS booted (since you can't
+use it without) but no device drivers is 21020. MEMLO is awfully high
+($6a00).
+
+For AMSB 2 with DOS booted, but without the extensions loaded, FRE(0)
+is 24352. With extensions it's 20642 (even though the banner says 20644
+BYTES FREE).
+
+AMSB 2 without DOS gives you 29980, but how are you gonna load or save
+programs without DOS? Nobody wants to use cassette, especially not
+people who could afford to buy the AMSB II cartridge.
+
+
+LOCKed Programs
+---------------
+
+If you save a program with SAVE "filename" LOCK, it gets saved in an
+"encrypted" form. Loading a locked program disables the LISTing or
+editing the program (you get LK ERROR if you try).
+
+The "encryption" is no better than ROT13. To encrypt, subtract each
+byte from 0x54 (in an 8-bit register, using twos complement). To
+decrypt, do the same. This is a reciprocal cipher, and you can think
+of it as the binary equivalent of ROT13.
+
+You can tell a LOCKed program because its first byte will be 1 instead
+of 0. The next 2 bytes (the program length) unencrypted. The rest of
+the file is encrypted with the lame scheme described above.
+
+When AMSB has a LOCKed program loaded into memory, it's *not* stored
+encrypted in RAM. It would be perfectly possible to write BASIC code
+using direct mode to write the tokenized program out to disk. The
+program starts at MEMLO and extends up to the first occurrence of
+three $00 bytes. The hardest part of this would be generating the
+header using only direct-mode BASIC statements (but it could be done).
+
+However... there's no need to do that. AMSB has a flag that tells it
+whether or not the currently-loaded program is LOCKed. You can just
+clear the flag::
+
+ POKE 168,0
+
+Now AMSB won't consider the program LOCKed, and you can SAVE a regular
+copy of it (and LIST, edit, etc).
+
+
+Line Length Limit
+-----------------
+
+In the editor, after a POKE 82,0 (to set the left margin to 0), you
+can enter 120 characters (3 screen lines) on a logical line. If you
+enter a program line that way *without* a space after the line number,
+then LIST it, it will be 121 characters long, because AMSB will
+display a space after the line number.
+
+If you use a text editor (or write a program) to create an untokenized
+BASIC program, you can have a line of code that's 125 characters
+long. AMSB will accept it just fine, with LOAD. If a line is 126
+characters or longer, AMSB will silently ignore that line when
+LOADing.
+
+If you create a 125-character line (with a text editor) consisting
+only of a comment that begins with ! or ', without a space after the
+line number, LOAD it, then SAVE it, that line will be 129 bytes long
+in tokenized form. AMSB will LOAD it with no problems.
+
+If you hex-edit a SAVEd file to create a longer line, AMSB will
+accept that, too... up to 255 bytes. At 256 bytes, AMSB will lock
+up after LOAD.
+
+
+Crunching
+---------
+
+AMSB stores spaces in the tokenized program, just like other 8-bit
+MS BASICs do, but it requires you to put spaces between keywords and
+variables (unlike e.g. Commodore 64 BASIC). This seems to be because
+AMSB allows keywords inside of variable names: you can have a variable
+called LIFE (which contains the keyword IF) in AMSB, but you can't in
+C=64 BASIC (which gives a syntax error becase it sees "L IF E").
+
+This applies to numbers, too: POKE710,0 is a syntax error in
+AMSB. This is because POKE710 is actually a valid variable name: try
+POKE710=123 followed by PRINT POKE710.
+
+However. The spaces aren't needed when the program is RUN. It would be
+possible to remove all the spaces outside of strings or comments and
+the program would still work fine.
diff --git a/amsbtok.h b/amsbtok.h
new file mode 100644
index 0000000..fe83906
--- /dev/null
+++ b/amsbtok.h
@@ -0,0 +1,161 @@
+const char *std_tokens[] = {
+ "END", /* 80 */
+ "FOR", /* 81 */
+ "NEXT", /* 82 */
+ "READ", /* 83 */
+ "DATA", /* 84 */
+ "RESTORE", /* 85 */
+ "LINE", /* 86 */
+ "INPUT", /* 87 */
+ "DEFSTR", /* 88 */
+ "DEFINT", /* 89 */
+ "DEFDBL", /* 8a */
+ "DEFSNG", /* 8b */
+ "OPTION", /* 8c */
+ "DIM", /* 8d */
+ "COMMON", /* 8e */
+ "DEF", /* 8f */
+ "LET", /* 90 */
+ "RANDOMIZE", /* 91 */
+ "GOTO", /* 92 */
+ "GOSUB", /* 93 */
+ "RETURN", /* 94 */
+ "GO", /* 95 */
+ "RUN", /* 96 */
+ "IF", /* 97 */
+ "REM", /* 98 */
+ "\"", /* 99 */
+ "'", /* 9a */
+ "!", /* 9b */
+ "ELSE", /* 9c */
+ "THEN", /* 9d */
+ "STOP", /* 9e */
+ "CONT", /* 9f */
+ "RESUME", /* a0 */
+ "ERROR", /* a1 */
+ "ON", /* a2 */
+ "AFTER", /* a3 */
+ "POKE", /* a4 */
+ "WAIT", /* a5 */
+ "MOVE", /* a6 */
+ "LOAD", /* a7 */
+ "SAVE", /* a8 */
+ "VERIFY", /* a9 */
+ "MERGE", /* aa */
+ "PRINT ", /* ab */
+ "PRINT", /* ac */
+ "LIST", /* ad */
+ "AUTO", /* ae */
+ "DEL", /* af */
+ "TRON", /* b0 */
+ "TROFF", /* b1 */
+ "RENUM", /* b2 */
+ "OPEN", /* b3 */
+ "CLOSE", /* b4 */
+ "GET", /* b5 */
+ "PUT", /* b6 */
+ "NOTE", /* b7 */
+ "LOCK", /* b8 */
+ "UNLOCK", /* b9 */
+ "KILL", /* ba */
+ "NAME", /* bb */
+ "GRAPHICS", /* bc */
+ "COLOR", /* bd */
+ "PLOT", /* be */
+ "FILL", /* bf */
+ "SETCOLOR", /* c0 */
+ "SOUND", /* c1 */
+ "CLS", /* c2 */
+ "DOS", /* c3 */
+ "CLEAR", /* c4 */
+ "NEW", /* c5 */
+ "CLOAD", /* c6 */
+ "CSAVE", /* c7 */
+ "\"", /* c8 */
+ "\"", /* c9 */
+ "\"", /* ca */
+ "\"", /* cb */
+ "\"", /* cc */
+ "\"", /* cd */
+ "\"", /* ce */
+ "\"", /* cf */
+ "\"", /* d0 */
+ "BASE", /* d1 */
+ "TAB(", /* d2 */
+ "TO", /* d3 */
+ "SUB", /* d4 */
+ "\"", /* d5 */
+ "SPC(", /* d6 */
+ "NOT", /* d7 */
+ "STEP", /* d8 */
+ "ALL", /* d9 */
+ "USING", /* da */
+ "RESERVE", /* db */
+ "UPDATE", /* dc */
+ "OUTPUT", /* dd */
+ "APPEND", /* de */
+ "AT(", /* df */
+ "AT ", /* e0 */
+ "PLM0", /* e1 */
+ "PLM2", /* e2 */
+ "PLM1", /* e3 */
+ "CHR0", /* e4 */
+ "CHR1", /* e5 */
+ "CHR2", /* e6 */
+ "\"", /* e7 */
+ "\"", /* e8 */
+ "\"", /* e9 */
+ "\"", /* ea */
+ "\"", /* eb */
+ "\"", /* ec */
+ "\"", /* ed */
+ "+", /* ee */
+ "-", /* ef */
+ "*", /* f0 */
+ "/", /* f1 */
+ "^", /* f2 */
+ "AND", /* f3 */
+ "OR", /* f4 */
+ "XOR", /* f5 */
+ ">", /* f6 */
+ "=", /* f7 */
+ "<", /* f8 */
+};
+
+const char *ext_tokens[] = {
+ "SGN", /* ffa3 */
+ "INT", /* ffa4 */
+ "ABS", /* ffa5 */
+ "FRE", /* ffa6 */
+ "POS", /* ffa7 */
+ "SQR", /* ffa8 */
+ "LOG", /* ffa9 */
+ "EXP", /* ffaa */
+ "COS", /* ffab */
+ "SIN", /* ffac */
+ "TAN", /* ffad */
+ "ATN", /* ffae */
+ "PEEK", /* ffaf */
+ "LEN", /* ffb0 */
+ "STR$", /* ffb1 */
+ "VAL", /* ffb2 */
+ "ASC", /* ffb3 */
+ "CHR$", /* ffb4 */
+ "STATUS", /* ffb5 */
+ "EOF", /* ffb6 */
+ "LEFT$", /* ffb7 */
+ "RIGHT$", /* ffb8 */
+ "MID$", /* ffb9 */
+ "INSTR", /* ffba */
+ "STRING$", /* ffbb */
+ "VARPTR", /* ffbc */
+ "USR", /* ffbd */
+ "SCRN$", /* ffbe */
+ "RND", /* ffbf */
+ "TIME$", /* ffc0 */
+ "TIME", /* ffc1 */
+ "INKEY$", /* ffc2 */
+ "ERR", /* ffc3 */
+ "ERL", /* ffc4 */
+ "STACK", /* ffc5 */
+};
diff --git a/aplus_tokens.c b/aplus_tokens.c
new file mode 100644
index 0000000..d685189
--- /dev/null
+++ b/aplus_tokens.c
@@ -0,0 +1,179 @@
+/* these have to be full sets of tokens, because A+'s tokens don't
+ match Atari BASIC's */
+
+const char *aplus_cmds[] = {
+ "REM", /* $00 */
+ "DATA", /* $01 */
+ "INPUT", /* $02 */
+ "LIST", /* $03 */
+ "ENTER", /* $04 */
+ "LET", /* $05 */
+ "IF", /* $06 */
+ "FOR", /* $07 */
+ "NEXT", /* $08 */
+ "GOTO", /* $09 */
+ "RENUM", /* $0a */
+ "GOSUB", /* $0b */
+ "TRAP", /* $0c */
+ "BYE", /* $0d */
+ "CONT", /* $0e */
+ "CLOSE", /* $0f */
+ "CLR", /* $10 */
+ "DEG", /* $11 */
+ "DIM", /* $12 */
+ "WHILE", /* $13 */
+ "ENDWHILE", /* $14 */
+ "TRACEOFF", /* $15 */
+ "TRACE", /* $16 */
+ "ELSE", /* $17 */
+ "ENDIF", /* $18 */
+ "END", /* $19 */
+ "NEW", /* $1a */
+ "OPEN", /* $1b */
+ "LOAD", /* $1c */
+ "SAVE", /* $1d */
+ "STATUS", /* $1e */
+ "NOTE", /* $1f */
+ "POINT", /* $20 */
+ "XIO", /* $21 */
+ "ON", /* $22 */
+ "POKE", /* $23 */
+ "DPOKE", /* $24 */
+ "PRINT", /* $25 */
+ "RAD", /* $26 */
+ "READ", /* $27 */
+ "RESTORE", /* $28 */
+ "RETURN", /* $29 */
+ "RUN", /* $2a */
+ "STOP", /* $2b */
+ "POP", /* $2c */
+ "?", /* $2d */
+ "GET", /* $2e */
+ "PUT", /* $2f */
+ "LOMEM", /* $30 */
+ "DEL", /* $31 */
+ "RPUT", /* $32 */
+ "RGET", /* $33 */
+ "BPUT", /* $34 */
+ "BGET", /* $35 */
+ "TAB", /* $36 */
+ "CP", /* $37 */
+ "DOS", /* $38 */
+ "ERASE", /* $39 */
+ "PROTECT", /* $3a */
+ "UNPROTECT", /* $3b */
+ "DIR", /* $3c */
+ "RENAME", /* $3d */
+ "MOVE", /* $3e */
+ "COLOR", /* $3f */
+ "GRAPHICS", /* $40 */
+ "PLOT", /* $41 */
+ "POSITION", /* $42 */
+ "DRAWTO", /* $43 */
+ "SETCOLOR", /* $44 */
+ "LOCATE", /* $45 */
+ "SOUND", /* $46 */
+ "LPRINT", /* $47 */
+ "CSAVE", /* $48 */
+ "CLOAD", /* $49 */
+ "MISSILE", /* $4a */
+ "PMCLR", /* $4b */
+ "PMCOLOR", /* $4c */
+ "PMGRAPHICS", /* $4d */
+ "PMMOVE", /* $4e */
+ "PMWIDTH", /* $4f */
+ "SET", /* $50 */
+ "LVAR", /* $51 */
+ "", /* $52, silent LET */
+ "ERROR- " /* $53 */
+};
+
+const int aplus_cmd_size = sizeof(aplus_cmds);
+
+const char *aplus_ops[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,
+ ",", /* $12 */
+ "$", /* $13 */
+ ":", /* $14 */
+ ";", /* $15 */
+ "", /* $16 */
+ " GOTO ", /* $17 */
+ " GOSUB ", /* $18 */
+ " TO ", /* $19 */
+ " STEP ", /* $1a */
+ " THEN ", /* $1b */
+ " USING ", /* $1c */
+ "#", /* $1d */
+ "<=", /* $1e */
+ "<>", /* $1f */
+ ">=", /* $20 */
+ "<", /* $21 */
+ ">", /* $22 */
+ "=", /* $23 */
+ "^", /* $24 */
+ "*", /* $25 */
+ "+", /* $26 */
+ "-", /* $27 */
+ "/", /* $28 */
+ " NOT ", /* $29 */
+ " OR ", /* $2a */
+ " AND ", /* $2b */
+ "!", /* $2c */
+ "&", /* $2d */
+ "(", /* $2e */
+ ")", /* $2f */
+ "=", /* $30 */
+ "=", /* $31 */
+ "<=", /* $32 */
+ "<>", /* $33 */
+ ">=", /* $34 */
+ "<", /* $35 */
+ ">", /* $36 */
+ "=", /* $37 */
+ "+", /* $38 */
+ "-", /* $39 */
+ "(", /* $3a */
+ "", /* $3b */
+ "", /* $3c */
+ "(", /* $3d */
+ "(", /* $3e */
+ ",", /* $3f */
+ "STR$", /* $40 */
+ "CHR$", /* $41 */
+ "USR", /* $42 */
+ "ASC", /* $43 */
+ "VAL", /* $44 */
+ "LEN", /* $45 */
+ "ADR", /* $46 */
+ "BUMP", /* $47 */
+ "FIND", /* $48 */
+ "DPEEK", /* $49 */
+ "ATN", /* $4a */
+ "COS", /* $4b */
+ "PEEK", /* $4c */
+ "SIN", /* $4d */
+ "RND", /* $4e */
+ "FRE", /* $4f */
+ "EXP", /* $50 */
+ "LOG", /* $51 */
+ "CLOG", /* $52 */
+ "SQR", /* $53 */
+ "SGN", /* $54 */
+ "ABS", /* $55 */
+ "INT", /* $56 */
+ "SYS", /* $57 */
+ "PADDLE", /* $58 */
+ "STICK", /* $59 */
+ "PTRIG", /* $5a */
+ "STRIG", /* $5b */
+ "VSTICK", /* $5c */
+ "HSTICK", /* $5d */
+ "PMADR", /* $5e */
+ "ERR", /* $5f */
+ "TAB", /* $60 */
+ "PEN", /* $61 */
+};
+
+const int aplus_ops_size = sizeof(aplus_ops);
diff --git a/aplus_tokens.h b/aplus_tokens.h
new file mode 100644
index 0000000..f0c905d
--- /dev/null
+++ b/aplus_tokens.h
@@ -0,0 +1,5 @@
+extern const char *aplus_cmds[];
+extern const char *aplus_ops[];
+
+extern const int aplus_cmd_size;
+extern const int aplus_ops_size;
diff --git a/atables.c b/atables.c
new file mode 100644
index 0000000..fd086b4
--- /dev/null
+++ b/atables.c
@@ -0,0 +1,396 @@
+/* ATASCII to UTF-8 tables. Generated by mkatables.pl.
+ Do not edit this file; edit mkatables.pl instead. */
+
+const char *ata2utf[] = {
+ "♥", /* 0 $00 ^@ */
+ "┣", /* 1 $01 ^A */
+ "┃", /* 2 $02 ^B */
+ "┛", /* 3 $03 ^C */
+ "┫", /* 4 $04 ^D */
+ "┓", /* 5 $05 ^E */
+ "╱", /* 6 $06 ^F */
+ "╲", /* 7 $07 ^G */
+ "◢", /* 8 $08 ^H */
+ "▗", /* 9 $09 ^I */
+ "◣", /* 10 $0a ^J */
+ "▝", /* 11 $0b ^K */
+ "▘", /* 12 $0c ^L */
+ "▔", /* 13 $0d ^M */
+ "▁", /* 14 $0e ^N */
+ "▖", /* 15 $0f ^O */
+ "♣", /* 16 $10 ^P */
+ "┏", /* 17 $11 ^Q */
+ "━", /* 18 $12 ^R */
+ "╋", /* 19 $13 ^S */
+ "●", /* 20 $14 ^T */
+ "▄", /* 21 $15 ^U */
+ "▎", /* 22 $16 ^V */
+ "┳", /* 23 $17 ^W */
+ "┻", /* 24 $18 ^X */
+ "▌", /* 25 $19 ^Y */
+ "┗", /* 26 $1a ^Z */
+ "Ę", /* 27 $1b ^[ */
+ "↑", /* 28 $1c ^\ */
+ "↓", /* 29 $1d ^] */
+ "←", /* 30 $1e ^^ */
+ "→", /* 31 $1f ^_ */
+ " ", /* 32 $20 */
+ "!", /* 33 $21 ! */
+ "\"", /* 34 $22 " */
+ "#", /* 35 $23 # */
+ "$", /* 36 $24 $ */
+ "%", /* 37 $25 % */
+ "&", /* 38 $26 & */
+ "'", /* 39 $27 ' */
+ "(", /* 40 $28 ( */
+ ")", /* 41 $29 ) */
+ "*", /* 42 $2a * */
+ "+", /* 43 $2b + */
+ ",", /* 44 $2c , */
+ "-", /* 45 $2d - */
+ ".", /* 46 $2e . */
+ "/", /* 47 $2f / */
+ "0", /* 48 $30 0 */
+ "1", /* 49 $31 1 */
+ "2", /* 50 $32 2 */
+ "3", /* 51 $33 3 */
+ "4", /* 52 $34 4 */
+ "5", /* 53 $35 5 */
+ "6", /* 54 $36 6 */
+ "7", /* 55 $37 7 */
+ "8", /* 56 $38 8 */
+ "9", /* 57 $39 9 */
+ ":", /* 58 $3a : */
+ ";", /* 59 $3b ; */
+ "<", /* 60 $3c < */
+ "=", /* 61 $3d = */
+ ">", /* 62 $3e > */
+ "?", /* 63 $3f ? */
+ "@", /* 64 $40 @ */
+ "A", /* 65 $41 A */
+ "B", /* 66 $42 B */
+ "C", /* 67 $43 C */
+ "D", /* 68 $44 D */
+ "E", /* 69 $45 E */
+ "F", /* 70 $46 F */
+ "G", /* 71 $47 G */
+ "H", /* 72 $48 H */
+ "I", /* 73 $49 I */
+ "J", /* 74 $4a J */
+ "K", /* 75 $4b K */
+ "L", /* 76 $4c L */
+ "M", /* 77 $4d M */
+ "N", /* 78 $4e N */
+ "O", /* 79 $4f O */
+ "P", /* 80 $50 P */
+ "Q", /* 81 $51 Q */
+ "R", /* 82 $52 R */
+ "S", /* 83 $53 S */
+ "T", /* 84 $54 T */
+ "U", /* 85 $55 U */
+ "V", /* 86 $56 V */
+ "W", /* 87 $57 W */
+ "X", /* 88 $58 X */
+ "Y", /* 89 $59 Y */
+ "Z", /* 90 $5a Z */
+ "[", /* 91 $5b [ */
+ "\\", /* 92 $5c \ */
+ "]", /* 93 $5d ] */
+ "^", /* 94 $5e ^ */
+ "_", /* 95 $5f _ */
+ "◆", /* 96 $60 ` */
+ "a", /* 97 $61 a */
+ "b", /* 98 $62 b */
+ "c", /* 99 $63 c */
+ "d", /* 100 $64 d */
+ "e", /* 101 $65 e */
+ "f", /* 102 $66 f */
+ "g", /* 103 $67 g */
+ "h", /* 104 $68 h */
+ "i", /* 105 $69 i */
+ "j", /* 106 $6a j */
+ "k", /* 107 $6b k */
+ "l", /* 108 $6c l */
+ "m", /* 109 $6d m */
+ "n", /* 110 $6e n */
+ "o", /* 111 $6f o */
+ "p", /* 112 $70 p */
+ "q", /* 113 $71 q */
+ "r", /* 114 $72 r */
+ "s", /* 115 $73 s */
+ "t", /* 116 $74 t */
+ "u", /* 117 $75 u */
+ "v", /* 118 $76 v */
+ "w", /* 119 $77 w */
+ "x", /* 120 $78 x */
+ "y", /* 121 $79 y */
+ "z", /* 122 $7a z */
+ "♠", /* 123 $7b { */
+ "|", /* 124 $7c | */
+ "↰", /* 125 $7d } */
+ "◀", /* 126 $7e ~ */
+ "▶", /* 127 $7f [del] */
+};
+
+const char *ics2utf[] = {
+ "á", /* 0 $00 ^@ */
+ "ù", /* 1 $01 ^A */
+ "Ñ", /* 2 $02 ^B */
+ "É", /* 3 $03 ^C */
+ "ç", /* 4 $04 ^D */
+ "ô", /* 5 $05 ^E */
+ "ò", /* 6 $06 ^F */
+ "ì", /* 7 $07 ^G */
+ "£", /* 8 $08 ^H */
+ "ï", /* 9 $09 ^I */
+ "ü", /* 10 $0a ^J */
+ "ä", /* 11 $0b ^K */
+ "Ö", /* 12 $0c ^L */
+ "ú", /* 13 $0d ^M */
+ "ó", /* 14 $0e ^N */
+ "ö", /* 15 $0f ^O */
+ "Ü", /* 16 $10 ^P */
+ "â", /* 17 $11 ^Q */
+ "û", /* 18 $12 ^R */
+ "î", /* 19 $13 ^S */
+ "é", /* 20 $14 ^T */
+ "è", /* 21 $15 ^U */
+ "ñ", /* 22 $16 ^V */
+ "ê", /* 23 $17 ^W */
+ "ȧ", /* 24 $18 ^X */
+ "à", /* 25 $19 ^Y */
+ "Ȧ", /* 26 $1a ^Z */
+ "Ę", /* 27 $1b ^[ */
+ "↑", /* 28 $1c ^\ */
+ "↓", /* 29 $1d ^] */
+ "←", /* 30 $1e ^^ */
+ "→", /* 31 $1f ^_ */
+ " ", /* 32 $20 */
+ "!", /* 33 $21 ! */
+ "\"", /* 34 $22 " */
+ "#", /* 35 $23 # */
+ "$", /* 36 $24 $ */
+ "%", /* 37 $25 % */
+ "&", /* 38 $26 & */
+ "'", /* 39 $27 ' */
+ "(", /* 40 $28 ( */
+ ")", /* 41 $29 ) */
+ "*", /* 42 $2a * */
+ "+", /* 43 $2b + */
+ ",", /* 44 $2c , */
+ "-", /* 45 $2d - */
+ ".", /* 46 $2e . */
+ "/", /* 47 $2f / */
+ "0", /* 48 $30 0 */
+ "1", /* 49 $31 1 */
+ "2", /* 50 $32 2 */
+ "3", /* 51 $33 3 */
+ "4", /* 52 $34 4 */
+ "5", /* 53 $35 5 */
+ "6", /* 54 $36 6 */
+ "7", /* 55 $37 7 */
+ "8", /* 56 $38 8 */
+ "9", /* 57 $39 9 */
+ ":", /* 58 $3a : */
+ ";", /* 59 $3b ; */
+ "<", /* 60 $3c < */
+ "=", /* 61 $3d = */
+ ">", /* 62 $3e > */
+ "?", /* 63 $3f ? */
+ "@", /* 64 $40 @ */
+ "A", /* 65 $41 A */
+ "B", /* 66 $42 B */
+ "C", /* 67 $43 C */
+ "D", /* 68 $44 D */
+ "E", /* 69 $45 E */
+ "F", /* 70 $46 F */
+ "G", /* 71 $47 G */
+ "H", /* 72 $48 H */
+ "I", /* 73 $49 I */
+ "J", /* 74 $4a J */
+ "K", /* 75 $4b K */
+ "L", /* 76 $4c L */
+ "M", /* 77 $4d M */
+ "N", /* 78 $4e N */
+ "O", /* 79 $4f O */
+ "P", /* 80 $50 P */
+ "Q", /* 81 $51 Q */
+ "R", /* 82 $52 R */
+ "S", /* 83 $53 S */
+ "T", /* 84 $54 T */
+ "U", /* 85 $55 U */
+ "V", /* 86 $56 V */
+ "W", /* 87 $57 W */
+ "X", /* 88 $58 X */
+ "Y", /* 89 $59 Y */
+ "Z", /* 90 $5a Z */
+ "[", /* 91 $5b [ */
+ "\\", /* 92 $5c \ */
+ "]", /* 93 $5d ] */
+ "^", /* 94 $5e ^ */
+ "_", /* 95 $5f _ */
+ "¡", /* 96 $60 ` */
+ "a", /* 97 $61 a */
+ "b", /* 98 $62 b */
+ "c", /* 99 $63 c */
+ "d", /* 100 $64 d */
+ "e", /* 101 $65 e */
+ "f", /* 102 $66 f */
+ "g", /* 103 $67 g */
+ "h", /* 104 $68 h */
+ "i", /* 105 $69 i */
+ "j", /* 106 $6a j */
+ "k", /* 107 $6b k */
+ "l", /* 108 $6c l */
+ "m", /* 109 $6d m */
+ "n", /* 110 $6e n */
+ "o", /* 111 $6f o */
+ "p", /* 112 $70 p */
+ "q", /* 113 $71 q */
+ "r", /* 114 $72 r */
+ "s", /* 115 $73 s */
+ "t", /* 116 $74 t */
+ "u", /* 117 $75 u */
+ "v", /* 118 $76 v */
+ "w", /* 119 $77 w */
+ "x", /* 120 $78 x */
+ "y", /* 121 $79 y */
+ "z", /* 122 $7a z */
+ "Ä", /* 123 $7b { */
+ "|", /* 124 $7c | */
+ "↰", /* 125 $7d } */
+ "◀", /* 126 $7e ~ */
+ "▶", /* 127 $7f [del] */
+};
+
+const char *ata2mag[] = {
+ "{ctrl-,}", /* 0 $00 ^@ */
+ "{ctrl-A}", /* 1 $01 ^A */
+ "{ctrl-B}", /* 2 $02 ^B */
+ "{ctrl-C}", /* 3 $03 ^C */
+ "{ctrl-D}", /* 4 $04 ^D */
+ "{ctrl-E}", /* 5 $05 ^E */
+ "{ctrl-F}", /* 6 $06 ^F */
+ "{ctrl-G}", /* 7 $07 ^G */
+ "{ctrl-H}", /* 8 $08 ^H */
+ "{ctrl-I}", /* 9 $09 ^I */
+ "{ctrl-J}", /* 10 $0a ^J */
+ "{ctrl-K}", /* 11 $0b ^K */
+ "{ctrl-L}", /* 12 $0c ^L */
+ "{ctrl-M}", /* 13 $0d ^M */
+ "{ctrl-N}", /* 14 $0e ^N */
+ "{ctrl-O}", /* 15 $0f ^O */
+ "{ctrl-P}", /* 16 $10 ^P */
+ "{ctrl-Q}", /* 17 $11 ^Q */
+ "{ctrl-R}", /* 18 $12 ^R */
+ "{ctrl-S}", /* 19 $13 ^S */
+ "{ctrl-T}", /* 20 $14 ^T */
+ "{ctrl-U}", /* 21 $15 ^U */
+ "{ctrl-V}", /* 22 $16 ^V */
+ "{ctrl-W}", /* 23 $17 ^W */
+ "{ctrl-X}", /* 24 $18 ^X */
+ "{ctrl-Y}", /* 25 $19 ^Y */
+ "{ctrl-Z}", /* 26 $1a ^Z */
+ "{esc}", /* 27 $1b ^[ */
+ "{up}", /* 28 $1c ^\ */
+ "{down}", /* 29 $1d ^] */
+ "{left}", /* 30 $1e ^^ */
+ "{right}", /* 31 $1f ^_ */
+ " ", /* 32 $20 */
+ "!", /* 33 $21 ! */
+ "\"", /* 34 $22 " */
+ "#", /* 35 $23 # */
+ "$", /* 36 $24 $ */
+ "%", /* 37 $25 % */
+ "&", /* 38 $26 & */
+ "'", /* 39 $27 ' */
+ "(", /* 40 $28 ( */
+ ")", /* 41 $29 ) */
+ "*", /* 42 $2a * */
+ "+", /* 43 $2b + */
+ ",", /* 44 $2c , */
+ "-", /* 45 $2d - */
+ ".", /* 46 $2e . */
+ "/", /* 47 $2f / */
+ "0", /* 48 $30 0 */
+ "1", /* 49 $31 1 */
+ "2", /* 50 $32 2 */
+ "3", /* 51 $33 3 */
+ "4", /* 52 $34 4 */
+ "5", /* 53 $35 5 */
+ "6", /* 54 $36 6 */
+ "7", /* 55 $37 7 */
+ "8", /* 56 $38 8 */
+ "9", /* 57 $39 9 */
+ ":", /* 58 $3a : */
+ ";", /* 59 $3b ; */
+ "<", /* 60 $3c < */
+ "=", /* 61 $3d = */
+ ">", /* 62 $3e > */
+ "?", /* 63 $3f ? */
+ "@", /* 64 $40 @ */
+ "A", /* 65 $41 A */
+ "B", /* 66 $42 B */
+ "C", /* 67 $43 C */
+ "D", /* 68 $44 D */
+ "E", /* 69 $45 E */
+ "F", /* 70 $46 F */
+ "G", /* 71 $47 G */
+ "H", /* 72 $48 H */
+ "I", /* 73 $49 I */
+ "J", /* 74 $4a J */
+ "K", /* 75 $4b K */
+ "L", /* 76 $4c L */
+ "M", /* 77 $4d M */
+ "N", /* 78 $4e N */
+ "O", /* 79 $4f O */
+ "P", /* 80 $50 P */
+ "Q", /* 81 $51 Q */
+ "R", /* 82 $52 R */
+ "S", /* 83 $53 S */
+ "T", /* 84 $54 T */
+ "U", /* 85 $55 U */
+ "V", /* 86 $56 V */
+ "W", /* 87 $57 W */
+ "X", /* 88 $58 X */
+ "Y", /* 89 $59 Y */
+ "Z", /* 90 $5a Z */
+ "[", /* 91 $5b [ */
+ "\\", /* 92 $5c \ */
+ "]", /* 93 $5d ] */
+ "^", /* 94 $5e ^ */
+ "_", /* 95 $5f _ */
+ "{ctrl-.}", /* 96 $60 ` */
+ "a", /* 97 $61 a */
+ "b", /* 98 $62 b */
+ "c", /* 99 $63 c */
+ "d", /* 100 $64 d */
+ "e", /* 101 $65 e */
+ "f", /* 102 $66 f */
+ "g", /* 103 $67 g */
+ "h", /* 104 $68 h */
+ "i", /* 105 $69 i */
+ "j", /* 106 $6a j */
+ "k", /* 107 $6b k */
+ "l", /* 108 $6c l */
+ "m", /* 109 $6d m */
+ "n", /* 110 $6e n */
+ "o", /* 111 $6f o */
+ "p", /* 112 $70 p */
+ "q", /* 113 $71 q */
+ "r", /* 114 $72 r */
+ "s", /* 115 $73 s */
+ "t", /* 116 $74 t */
+ "u", /* 117 $75 u */
+ "v", /* 118 $76 v */
+ "w", /* 119 $77 w */
+ "x", /* 120 $78 x */
+ "y", /* 121 $79 y */
+ "z", /* 122 $7a z */
+ "{ctrl-;}", /* 123 $7b { */
+ "|", /* 124 $7c | */
+ "{clear}", /* 125 $7d } */
+ "{bksp}", /* 126 $7e ~ */
+ "{tab}", /* 127 $7f [del] */
+};
+
diff --git a/atables.h b/atables.h
new file mode 100644
index 0000000..5262ec5
--- /dev/null
+++ b/atables.h
@@ -0,0 +1,3 @@
+extern const char *ata2utf[];
+extern const char *ics2utf[];
+extern const char *ata2mag[];
diff --git a/atascii.7 b/atascii.7
index 4498caf..cd5192e 100644
--- a/atascii.7
+++ b/atascii.7
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "ATASCII" 7 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "ATASCII" 7 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
atascii \- Atari 8-bit character set
.\" RST source for atascii(7) man page. Convert with:
@@ -1687,9 +1687,7 @@ T{
T} T{
7c
T} T{
-.nf
-
-.fi
+|
T} T{
252
T} T{
@@ -1716,7 +1714,7 @@ T{
T} T{
7e
T} T{
-[delete]
+[backspace]
T} T{
254
T} T{
@@ -2152,25 +2150,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/atascii.c b/atascii.c
new file mode 100644
index 0000000..d4e4a91
--- /dev/null
+++ b/atascii.c
@@ -0,0 +1,157 @@
+#include "atascii.h"
+
+const char *atascii_inverse_on = "\x1b[7m";
+const char *atascii_inverse_off = "\x1b[27m";
+
+/* only called in magazine mode. cursor control characters
+ like a bell in the middle of a non-inverse string
+ should not cause it to print {inv}{bell}{norm}. The {bell}
+ is "inherently" inverse (since its high bit is set) but doesn't
+ need to be printed that way. */
+static int affects_inv(int c) {
+ switch(c) {
+ case 0x1b: /* esc */
+ case 0x1c: /* up */
+ case 0x1d: /* down */
+ case 0x1e: /* left */
+ case 0x1f: /* right */
+ case 0x9b: /* EOL */
+ case 0x9c: /* del line */
+ case 0x9d: /* ins line */
+ case 0x9e: /* clear tab */
+ case 0x9f: /* set tab */
+ case 0x7d: /* cls */
+ case 0x7e: /* BS */
+ case 0x7f: /* tab */
+ case 0xfd: /* bell */
+ case 0xfe: /* del chr */
+ case 0xff: /* ins chr */
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+int atascii_context_init(atascii_ctx *ctx, int mode, int flags) {
+ memset(ctx, 0, sizeof(atascii_ctx));
+
+ switch(mode) {
+ case ATA_MODE_UTF8:
+ if(flags & ATA_FLAG_ICS)
+ ctx->table = ics2utf;
+ else
+ ctx->table = ata2utf;
+ break;
+ case ATA_MODE_MAGAZINE:
+ ctx->flags &= ~ATA_FLAG_UNDERLINE;
+ ctx->table = ata2mag;
+ break;
+ default:
+ return 0;
+ }
+
+ ctx->mode = mode;
+ ctx->flags = flags;
+
+ return 1;
+}
+
+char *atascii_a2utf(atascii_ctx *ctx, int src, char *dest) {
+ dest[0] = 0;
+
+ if(src == ATA_CHR_FINISH) {
+ if(ctx->inv)
+ strcpy(dest, ctx->mode == ATA_MODE_MAGAZINE ? "{norm}": atascii_inverse_off);
+ return dest;
+ }
+
+ if(src == 0x9b) {
+ strcpy(dest, "\n");
+ ctx->lines++;
+ return dest;
+ }
+
+ if(ctx->flags & ATA_FLAG_TEXTMODE) {
+ switch(src) {
+ case 0x7f: /* tab */
+ strcpy(dest, "\t");
+ return dest;
+ case 0xfd: /* bell */
+ strcpy(dest, "\a");
+ return dest;
+ case 0x7e: /* backspace */
+ strcpy(dest, "\b");
+ return dest;
+ default: break;
+ }
+ }
+
+ if(ctx->flags & ATA_FLAG_STRIP_INVERSE) src &= 0x7f;
+
+ if(!(ctx->flags & ATA_FLAG_UNDERLINE)) {
+ /* strings of inverse chars only get one "inverse on" ANSI
+ sequence, and one "inverse off" afterwards. */
+ if(src & 0x80) {
+ if(!ctx->inv) {
+ if(ctx->mode == ATA_MODE_MAGAZINE) {
+ if(affects_inv(src)) {
+ strcpy(dest, "{inv}");
+ ctx->inv = 1;
+ }
+ } else {
+ strcpy(dest, atascii_inverse_on);
+ ctx->inv = 1;
+ }
+ }
+ } else {
+ if(ctx->inv) {
+ if(ctx->mode == ATA_MODE_MAGAZINE) {
+ if(affects_inv(src)) {
+ strcpy(dest, "{norm}");
+ ctx->inv = 0;
+ }
+ } else {
+ strcpy(dest, atascii_inverse_off);
+ ctx->inv = 0;
+ }
+ }
+ }
+ }
+
+ if(ctx->mode == ATA_MODE_MAGAZINE) {
+ /* special cases: control codes with bit 7 set can't go
+ in the table since it's only got 128 entries. */
+ switch(src) {
+ case 0x9c:
+ strcat(dest, "{del-line}"); return dest;
+ case 0x9d:
+ strcat(dest, "{ins-line}"); return dest;
+ case 0x9e:
+ strcat(dest, "{clr-tab}"); return dest;
+ case 0x9f:
+ strcat(dest, "{set-tab}"); return dest;
+ case 0xfd:
+ strcat(dest, "{bell}"); return dest;
+ case 0xfe:
+ strcat(dest, "{del-char}"); return dest;
+ case 0xff:
+ strcat(dest, "{ins-char}"); return dest;
+ default: break;
+ }
+ }
+
+ strcat(dest, ctx->table[src & 0x7f]);
+
+ if((ctx->flags & ATA_FLAG_UNDERLINE) && (src & 0x80)) {
+ strcat(dest, "\b_");
+ }
+
+ return dest;
+}
+
+const char *atascii_finish(atascii_ctx *ctx) {
+ if(ctx->inv)
+ return ATA_MODE_MAGAZINE ? "{norm}": atascii_inverse_off;
+ else
+ return "";
+};
diff --git a/atascii.h b/atascii.h
new file mode 100644
index 0000000..08abc3f
--- /dev/null
+++ b/atascii.h
@@ -0,0 +1,44 @@
+#ifndef ATASCII_H
+#define ATASCII_H
+
+#include <stdio.h>
+#include <string.h>
+#include "atables.h"
+
+#define ATA_MODE_UTF8 0 /* default */
+#define ATA_MODE_MAGAZINE 1
+/* TODO: #define ATA_MODE_DOTS 2 */
+
+#define ATA_FLAG_NONE 0 /* default */
+#define ATA_FLAG_UNDERLINE 1
+#define ATA_FLAG_ICS 2
+#define ATA_FLAG_TEXTMODE 4
+#define ATA_FLAG_STRIP_INVERSE 8
+
+#define ATA_CHR_FINISH -1
+
+extern const char *atascii_inverse_on;
+extern const char *atascii_inverse_off;
+
+typedef struct {
+ int mode;
+ int flags;
+ int inv;
+ int lines;
+ const char **table;
+} atascii_ctx;
+
+/* returns true if mode and flags are valid, 0 otherwise. */
+extern int atascii_context_init(atascii_ctx *ctx, int mode, int flags);
+
+/* obeys all the flags and modes.
+ result goes in dest, which needs to be 9 bytes in utf-8 mode (big
+ enough to handle up to 4 bytes of UTF-8 plus 4 bytes of ANSI escape
+ code plus a terminating null), or 12 bytes in magazine mode.
+ the return value is dest.
+ */
+extern char *atascii_a2utf(atascii_ctx *ctx, int src, char *dest);
+
+extern const char *atascii_finish(atascii_ctx *ctx);
+
+#endif
diff --git a/atascii.rst b/atascii.rst
index b2ea369..54e47b8 100644
--- a/atascii.rst
+++ b/atascii.rst
@@ -153,9 +153,9 @@ brackets denote screen control codes.
"121", "79", "y", "249", "f9", ""
"122", "7a", "z", "250", "fa", ""
"123", "7b", "♠", "251", "fb", ""
- "124", "7c", "|", "252", "fc", ""
+ "124", "7c", "\|", "252", "fc", ""
"125", "7d", "[clear screen]", "253", "fd", "[bell]"
- "126", "7e", "[delete]", "254", "fe", "[delete char]"
+ "126", "7e", "[backspace]", "254", "fe", "[delete char]"
"127", "7f", "[tab]", "255", "ff", "[insert char]"
In the Atari XL and XE ROMs, there is a second character set, known as
diff --git a/atr2xfd.1 b/atr2xfd.1
index a192c2c..01fd585 100644
--- a/atr2xfd.1
+++ b/atr2xfd.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "ATR2XFD" 1 "2024-05-05" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "ATR2XFD" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
atr2xfd \- Convert an Atari 8-bit ATR disk image to a raw (XFD) image
.\" RST source for atr2xfd(1) man page. Convert with:
@@ -181,25 +181,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/atrsize.1 b/atrsize.1
index 031e230..bf21a80 100644
--- a/atrsize.1
+++ b/atrsize.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "ATRSIZE" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "ATRSIZE" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
atrsize \- Change the size of an Atari 8-bit ATR disk image, or create a blank ATR image
.\" RST source for atrsize(1) man page. Convert with:
@@ -195,25 +195,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/axe.1 b/axe.1
index f22b54f..0e77a07 100644
--- a/axe.1
+++ b/axe.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "AXE" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "AXE" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
axe \- ATR/XFD Editor
.\" RST source for axe(1) man page. Convert with:
@@ -136,25 +136,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/bas.c b/bas.c
new file mode 100644
index 0000000..5758110
--- /dev/null
+++ b/bas.c
@@ -0,0 +1,467 @@
+/* bas.c - API for writing standalone programs that deal with
+ tokenized Atari 8-bit BASIC program. */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+
+/* caller's parse_args() should set this for the -v option */
+int verbose = 0;
+
+/* hex constants work the same way in Turbo BASIC and BASIC XL/XE: they're
+ exactly like numeric constants, 6-byte BCD FP, but introduced with
+ OP_HEXCONST instead of OP_NUMCONST.
+ If allow_hex_const is set, on_exp_token will be called for OP_HEXCONST.
+ Otherwise, a warning will be printed, on_exp_token will NOT be called,
+ but the constant is skipped the same as a regular numeric, to keep
+ in sync with the token stream. */
+int allow_hex_const = 0;
+
+/* BASIC XL token 0x5a is followed by a single "subtoken", this skips it. */
+int bxl_exttok_hack = 0;
+
+/* 2 for OSS Integer BASIC, 6 for the BCD constants in all others. */
+int numconst_size = 6;
+
+/* BASIC/A+ and OSS Integer use the same cmd tokens for REM and DATA that
+ BASIC does, but not for the ERROR- token. bas.c needs to know what
+ token is ERROR- so it can handle it correctly. */
+int error_token = CMD_ERROR;
+
+unsigned short lomem;
+unsigned short vntp;
+unsigned short vntd;
+unsigned short vvtp;
+unsigned short stmtab;
+unsigned short stmcur;
+unsigned short starp;
+unsigned short codestart;
+unsigned short code_end;
+unsigned short save_command_pos;
+unsigned short save_command_tok;
+unsigned short vnstart;
+unsigned short vvstart;
+int filelen;
+const char *self;
+unsigned char program[BUFSIZE];
+FILE *input_file;
+FILE *output_file;
+char *output_filename = NULL;
+
+void die(const char *msg) {
+ fprintf(stderr, "%s: %s\n", self, msg);
+ exit(1);
+}
+
+void parse_general_args(int argc, char **argv, void (*helpfunc)()) {
+ if(argc < 2) {
+ (*helpfunc)();
+ exit(1);
+ }
+
+ if(strcmp(argv[1], "--help") == 0) {
+ (*helpfunc)();
+ exit(0);
+ }
+
+ if(strcmp(argv[1], "--version") == 0) {
+ printf("%s %s\n", self, VERSION);
+ exit(0);
+ }
+}
+
+/* read entire file into memory */
+void readfile(void) {
+ filelen = fread(program, 1, BUFSIZE - 1, input_file);
+ if(verbose) fprintf(stderr, "Read %d bytes.\n", filelen);
+ if(!feof(input_file))
+ fprintf(stderr, "Warning: file is >64KB, way too big for a BASIC program.\n");
+ else if(filelen > MAX_PROG_SIZE)
+ fprintf(stderr, "Warning: file is %d bytes, suspiciously large for a BASIC program.\n", filelen);
+ fclose(input_file);
+ input_file = NULL; /* so caller can tell it's closed */
+ if(filelen < MIN_PROG_SIZE)
+ die("File too short to be a BASIC program (truncated?)\n");
+}
+
+int writefile(void) {
+ int outbytes;
+
+ outbytes = fwrite(program, 1, filelen, output_file);
+ fclose(output_file);
+ output_file = NULL; /* so caller can tell it's closed */
+ if(verbose) fprintf(stderr, "Wrote %d bytes.\n", outbytes);
+ return outbytes;
+}
+
+/* get a 16-bit value from the file, in 6502 LSB/MSB order. */
+unsigned short getword(int addr) {
+ return program[addr] | (program[addr + 1] << 8);
+}
+
+void setword(int addr, int value) {
+ program[addr] = value & 0xff;
+ program[addr + 1] = value >> 8;
+}
+
+void dump_header_vars(void) {
+ fprintf(stderr, "LOMEM $%04x VNTP $%04x VNTD $%04x VVTP $%04x\n", lomem, vntp, vntd, vvtp);
+ fprintf(stderr, "STMTAB $%04x STMCUR $%04x STARP $%04x\n", stmtab, stmcur, starp);
+ fprintf(stderr, "vnstart $%04x, vvstart $%04x, codestart $%04x, code_end $%04x\n", vnstart, vvstart, codestart, code_end);
+ fprintf(stderr, "save_command_pos $%04x (tok $%02x)\n", save_command_pos, save_command_tok);
+}
+
+void parse_header(void) {
+ int vntp_offset;
+
+ lomem = getword(0);
+ vntp = getword(2);
+ vntd = getword(4);
+ vvtp = getword(6);
+ stmtab = getword(8);
+ stmcur = getword(10);
+ starp = getword(12);
+
+ codestart = stmtab - TBL_OFFSET - (vntp - 256);
+ vnstart = vntp - TBL_OFFSET;
+ vvstart = vvtp - TBL_OFFSET;
+ save_command_pos = stmcur - TBL_OFFSET;
+ save_command_tok = program[save_command_pos + 4];
+ code_end = starp - TBL_OFFSET;
+
+ if(vnstart > 0x0e) {
+ if(verbose)
+ fprintf(stderr, "VNTP is $%02x (not ($100), adjusting pointers.\n", vntp);
+ vntp_offset = vnstart - 0x0e;
+ vnstart -= vntp_offset;
+ vvstart -= vntp_offset;
+ }
+
+ if(filelen < code_end) {
+ fprintf(stderr, "Warning: file is truncated: %d bytes, should be %d.\n", filelen, code_end);
+ }
+
+ if(verbose) dump_header_vars();
+
+ /* these checks are actually kind of conservative. */
+ if(lomem == 0x77) {
+ numconst_size = 2;
+ if(verbose)
+ fprintf(stderr, "OSS Integer BASIC $7700 signature found, OK.\n");
+ } else if(lomem == 0) {
+ if(verbose)
+ fprintf(stderr, "BASIC $0000 signature found, OK.\n");
+ } else {
+ die("Not an Atari BASIC program (no $0000 or $7700 signature).");
+ }
+ if(vntp < 0x100) die("Not an Atari BASIC program (invalid VNTP).");
+ if(vvtp < vntd) die("Not an Atari BASIC program (invalid VVTP).");
+ if(starp < vvtp) die("Not an Atari BASIC program (invalid STARP).");
+}
+
+void update_header(void) {
+ setword(0, lomem);
+ setword(2, vntp);
+ setword(4, vntd);
+ setword(6, vvtp);
+ setword(8, stmtab);
+ setword(10, stmcur);
+ setword(12, starp);
+}
+
+/* sometimes the variable name table isn't large enough to hold
+ the generated variable names. move_code() makes more space,
+ by moving the rest of the program (including the variable value
+ table) up in memory. */
+void move_code(int offset) {
+ unsigned char *dest = program + vvstart + offset;
+
+ if(dest < program || ((filelen + offset) > (BUFSIZE - 1))) {
+ die("Attempt to move memory out of range; corrupt header bytes?\n");
+ }
+
+ memmove(dest, program + vvstart, filelen);
+
+ vntd += offset;
+ vvtp += offset;
+ stmtab += offset;
+ stmcur += offset;
+ starp += offset;
+ filelen += offset;
+ update_header();
+ parse_header();
+}
+
+void adjust_vntable_size(int oldsize, int newsize) {
+ int move_by;
+ if(oldsize != newsize) {
+ move_by = newsize - oldsize;
+ if(verbose) fprintf(stderr,
+ "Need %d bytes for vntable, have %d, moving VVTP by %d to $%04x.\n",
+ newsize, oldsize, move_by, vvtp + move_by);
+ move_code(move_by);
+ }
+}
+
+unsigned char get_vartype(unsigned char tok) {
+ return program[vvstart + (tok & 0x7f) * 8] >> 6;
+}
+
+/* return true if the variable name table is OK */
+int vntable_ok(void) {
+ int vp, bad;
+
+ if(vntp == vntd) {
+ if(verbose) fprintf(stderr, "No variables.\n");
+ return 1;
+ }
+
+ /* first pass: bad = 1 if all the bytes in the table have the same
+ value, no matter what it is. */
+ vp = vnstart + 1;
+
+ /* don't do this check if the table is only one byte long! */
+ if(vp < vvstart - 1) {
+ bad = 1;
+ while(vp < vvstart - 1) {
+ if(program[vp] != program[vnstart]) {
+ bad = 0;
+ break;
+ }
+ vp++;
+ }
+ if(bad) return 0;
+ }
+
+ /* 2nd pass: bad = 1 if there's any invalid character in the table. */
+ vp = vnstart;
+ while(vp < vvstart) {
+ unsigned char c = program[vp];
+
+ /* allow for (but don't require) dummy byte at VNTD. used to just
+ quit when we hit 0, but 0 might be part of a scrambled table. */
+ if(c == 0 && vp == (vvstart - 1)) break;
+
+ vp++;
+
+ /* inverse $ or ( is OK */
+ if(c == 0xa4 || c == 0xa8) continue;
+
+ /* numbers and letters are allowed, inverse or normal. */
+ c &= 0x7f;
+ if(c == '_') {
+ fprintf(stderr, "%s: Underscore in variable name; Turbo or BASIC XE?\n", self);
+ continue;
+ }
+ if(c >= 0x30 && c <= 0x39) continue;
+ if(c >= 0x41 && c <= 0x5a) continue;
+
+ bad++;
+ break;
+ }
+
+ return !bad;
+}
+
+void invalid_args(const char *arg) {
+ fprintf(stderr, "%s: Invalid argument '%s'.\n\n", self, arg);
+ exit(1);
+}
+
+FILE *open_file(const char *name, const char *mode) {
+ FILE *fp;
+ if(!(fp = fopen(name, mode))) {
+ perror(name);
+ exit(1);
+ }
+ return fp;
+}
+
+void open_input(const char *name) {
+ if(!name || strcmp(name, "-") == 0) {
+ if(isatty(fileno(stdin))) {
+ die("Can't read binary data from the terminal.");
+ }
+ if(freopen(NULL, "rb", stdin)) {
+ input_file = stdin;
+ return;
+ } else {
+ perror("stdin");
+ exit(1);
+ }
+ }
+
+ input_file = open_file(name, "rb");
+}
+
+void open_output(const char *name) {
+ if(!name || (strcmp(name, "-") == 0)) {
+ if(isatty(fileno(stdout))) {
+ die("Refusing to write binary data to the terminal.");
+ }
+ if(freopen(NULL, "wb", stdout)) {
+ output_file = stdout;
+ return;
+ } else {
+ perror("stdout");
+ exit(1);
+ }
+ }
+ output_file = open_file(name, "wb");
+}
+
+void set_self(const char *argv0) {
+ char *p;
+
+ self = argv0;
+ p = strrchr(self, '/');
+ if(p) self = p + 1;
+}
+
+/* callbacks */
+CALLBACK_PTR(on_start_line);
+CALLBACK_PTR(on_bad_line_length);
+CALLBACK_PTR(on_end_line);
+CALLBACK_PTR(on_start_stmt);
+CALLBACK_PTR(on_end_stmt);
+CALLBACK_PTR(on_cmd_token);
+CALLBACK_PTR(on_text);
+CALLBACK_PTR(on_exp_token);
+CALLBACK_PTR(on_var_token);
+CALLBACK_PTR(on_string_const);
+CALLBACK_PTR(on_num_const);
+CALLBACK_PTR(on_trailing_garbage);
+
+#define CALL(x) if(x) (*x)(lineno, pos, program[pos], end)
+
+void walk_code(unsigned int startlineno, unsigned int endlineno) {
+ int linepos, nextpos, offset, soffset, lineno = -1, tmpno, pos, end, tok;
+
+ linepos = codestart;
+ while(linepos < filelen) { /* loop over lines */
+ tmpno = getword(linepos);
+ if(tmpno <= lineno) {
+ fprintf(stderr, "Warning: line number %d at offset $%04x is <= previous line number %d.\n",
+ tmpno, linepos, lineno);
+ }
+ lineno = tmpno;
+ offset = program[linepos + 2];
+ nextpos = linepos + offset;
+ if(nextpos > filelen) {
+ fprintf(stderr, "Warning: program truncated in the middle of line %d.\n", lineno);
+ return;
+ }
+
+ end = nextpos;
+ pos = linepos;
+
+ if(offset < 5) {
+ /* actually, real Atari BASIC's minimum offset is 6. however, if you use
+ the "--" (line of dashes, command token 0x54) in Turbo BASIC XL, you
+ get an offset of 5, because there's no end-of-line after it.
+ it seems better to accomodate Turbo here. */
+ CALL(on_bad_line_length);
+ offset = program[linepos + 2]; /* on_bad_line_length fixed it (we hope) */
+ if(offset < 5)
+ die("Fatal: Program is code-protected; unprotect it first.");
+ }
+
+ if(lineno < startlineno) {
+ linepos = nextpos;
+ continue;
+ }
+
+ if(lineno > endlineno) break;
+
+ CALL(on_start_line);
+
+ pos = linepos + 3;
+ while(pos < nextpos) { /* loop over statements within a line */
+ soffset = program[pos];
+ if(!soffset) {
+ fprintf(stderr, "Fatal: next-statement offset is 0 at line %d, pos %04x\n", lineno, pos);
+ exit(1);
+ }
+ end = linepos + soffset;
+ CALL(on_start_stmt);
+
+ while(pos < end) { /* loop over tokens within a statement */
+ pos++;
+ CALL(on_cmd_token);
+
+ tok = program[pos];
+ if((tok == CMD_REM) || (tok == CMD_DATA) || /* same in all */
+ tok == error_token)
+ {
+ pos++;
+ CALL(on_text);
+ pos = end;
+ } else if(bxl_exttok_hack && tok == 0x5a) {
+ pos += 2; /* skip subtoken */
+ } else {
+ pos++;
+ }
+
+ while(pos < end) { /* loop over operators */
+ tok = program[pos];
+ switch(tok) {
+ case 0: /* Turbo variables numbered >= $80 */
+ CALL(on_exp_token);
+ /* on_exp_token callback better know what to do with $00! */
+ pos += 2;
+ break;
+ case OP_NUMCONST:
+ CALL(on_exp_token);
+ pos++;
+ CALL(on_num_const);
+ pos += numconst_size;
+ break;
+ case OP_HEXCONST:
+ if(allow_hex_const) {
+ CALL(on_exp_token);
+ } else {
+ fprintf(stderr, "%s: found Turbo/BXL/BXE hex constant at line %d, skipping\n", self, lineno);
+ }
+ pos++;
+ if(allow_hex_const) {
+ CALL(on_num_const);
+ }
+ pos += numconst_size;
+ break;
+ case OP_STRCONST:
+ CALL(on_exp_token);
+ pos++;
+ CALL(on_string_const);
+ pos += program[pos] + 1;
+ break;
+ default:
+ if(tok & 0x80) {
+ CALL(on_var_token);
+ } else {
+ CALL(on_exp_token);
+ }
+ pos++;
+ break;
+ }
+ }
+ CALL(on_end_stmt);
+ }
+ }
+
+ CALL(on_end_line);
+
+ linepos = nextpos;
+ if(lineno == 32768) break;
+ }
+
+ if(endlineno == 32768 && linepos < filelen) {
+ if(verbose)
+ fprintf(stderr, "%s: Trailing garbage at EOF, %d bytes.\n", self, filelen - linepos);
+ CALL(on_trailing_garbage);
+ }
+}
diff --git a/bas.h b/bas.h
new file mode 100644
index 0000000..5fb23b7
--- /dev/null
+++ b/bas.h
@@ -0,0 +1,252 @@
+/* bas.h - API for writing standalone programs that deal with
+ tokenized Atari 8-bit BASIC program. */
+
+/* maximum size of the program in memory. 64KB is actually way overkill. */
+#define BUFSIZE 65536
+
+/* the difference between the VVTP and VNTP values in the file, and the
+ actual file positions of the variable names and values. */
+#define TBL_OFFSET 0xf2
+
+/* minimum program size, for a program that has no variables and
+ only one line of code (the immediate line 32768, consisting only of
+ one token, which would be CSAVE). anything smaller than this, we
+ can't process. */
+#define MIN_PROG_SIZE 21
+
+/* maximum practical size for a BASIC program. if a file exceeds this
+ size, we warn about it, but otherwise process it normally.
+ this value is derived by subtracting the default LOMEM without DOS
+ ($0700) from the start of the display list in GR.0 ($9c20, on a 48K Atari).
+ */
+#define MAX_PROG_SIZE 38176
+
+/* maximum number of variables in the variable name and value tables. this
+ could be 128, but "ERROR- 4" still expands the tables. Entries >128
+ don't have tokens, can't be referred to in code, but we'll preserve
+ them anyway. */
+#define MAXVARS 256
+
+/* BASIC tokens. Full set, taken from Chapter 10 of De Re Atari.
+ I used a paper copy, but you can also find it on the web:
+ https://www.atariarchives.org/dere/chapt10.php
+ BASIC uses 2 sets of tokens, one for commands and the other for
+ operators (which is to say, everything *not* a command).
+ See tokens.h for the actual names. */
+
+/* commands (every statement begins with one of these) */
+#define CMD_REM 0x00
+#define CMD_DATA 0x01
+#define CMD_INPUT 0x02
+#define CMD_COLOR 0x03
+#define CMD_LIST 0x04
+#define CMD_ENTER 0x05
+#define CMD_LET 0x06
+#define CMD_IF 0x07
+#define CMD_FOR 0x08
+#define CMD_NEXT 0x09
+#define CMD_GOTO 0x0a
+#define CMD_GO_TO 0x0b
+#define CMD_GOSUB 0x0c
+#define CMD_TRAP 0x0d
+#define CMD_BYE 0x0e
+#define CMD_CONT 0x0f
+#define CMD_COM 0x10
+#define CMD_CLOSE 0x11
+#define CMD_CLR 0x12
+#define CMD_DEG 0x13
+#define CMD_DIM 0x14
+#define CMD_END 0x15
+#define CMD_NEW 0x16
+#define CMD_OPEN 0x17
+#define CMD_LOAD 0x18
+#define CMD_SAVE 0x19
+#define CMD_STATUS 0x1a
+#define CMD_NOTE 0x1b
+#define CMD_POINT 0x1c
+#define CMD_XIO 0x1d
+#define CMD_ON 0x1e
+#define CMD_POKE 0x1f
+#define CMD_PRINT 0x20
+#define CMD_RAD 0x21
+#define CMD_READ 0x22
+#define CMD_RESTORE 0x23
+#define CMD_RETURN 0x24
+#define CMD_RUN 0x25
+#define CMD_STOP 0x26
+#define CMD_POP 0x27
+#define CMD_QMARK 0x28 /* ? for PRINT */
+#define CMD_GET 0x29
+#define CMD_PUT 0x2a
+#define CMD_GRAPHICS 0x2b
+#define CMD_PLOT 0x2c
+#define CMD_POSITION 0x2d
+#define CMD_DOS 0x2e
+#define CMD_DRAWTO 0x2f
+#define CMD_SETCOLOR 0x30
+#define CMD_LOCATE 0x31
+#define CMD_SOUND 0x32
+#define CMD_LPRINT 0x33
+#define CMD_CSAVE 0x34
+#define CMD_CLOAD 0x35
+#define CMD_ILET 0x36 /* implied LET */
+#define CMD_ERROR 0x37
+
+/* operators. 0x00-0x0d and 0x0a-0x11 are not used in Atari BASIC;
+ 0x0d is used (in the same way) in both Turbo BASIC and BXL/BXE.
+ 0x3d-0x54 are functions. */
+#define OP_HEXCONST 0x0d
+#define OP_NUMCONST 0x0e
+#define OP_STRCONST 0x0f
+#define OP_COMMA 0x12
+#define OP_DOLLAR 0x13
+#define OP_EOS 0x14 /* two names: "end of statement"... */
+#define OP_COLON 0x14 /* ...and "colon" */
+#define OP_SEMICOLON 0x15
+#define OP_EOL 0x16
+#define OP_GOTO 0x17
+#define OP_GOSUB 0x18
+#define OP_TO 0x19
+#define OP_STEP 0x1a
+#define OP_THEN 0x1b
+#define OP_HASH 0x1c
+#define OP_NUM_LE 0x1d
+#define OP_NUM_NE 0x1e
+#define OP_NUM_GE 0x1f
+#define OP_NUM_LT 0x20
+#define OP_NUM_GT 0x21
+#define OP_NUM_EQ 0x22
+#define OP_POWER 0x23
+#define OP_MULT 0x24
+#define OP_PLUS 0x25
+#define OP_MINUS 0x26
+#define OP_DIVIDE 0x27
+#define OP_NOT 0x28
+#define OP_OR 0x29
+#define OP_AND 0x2a
+#define OP_GRP_LPAR 0x2b
+#define OP_GRP_RPAR 0x2c
+#define OP_NUM_ASSIGN 0x2d
+#define OP_STR_ASSIGN 0x2e
+#define OP_STR_LE 0x2f
+#define OP_STR_NE 0x30
+#define OP_STR_GE 0x31
+#define OP_STR_LT 0x32
+#define OP_STR_GT 0x33
+#define OP_STR_EQ 0x34
+#define OP_UPLUS 0x35
+#define OP_UMINUS 0x36
+#define OP_STR_LPAR 0x37
+#define OP_ARR_LPAR 0x38
+#define OP_DIM_ARR_LPAR 0x39
+#define OP_FUNC_LPAR 0x3a
+#define OP_DIM_STR_LPAR 0x3b
+#define OP_ARR_COMMA 0x3c /* used for A(1,1) or A$(1,1) (also in DIM) */
+#define OP_FUNC_STR 0x3d /* the rest are functions */
+#define OP_FUNC_CHR 0x3e
+#define OP_FUNC_USR 0x3f
+#define OP_FUNC_ASC 0x40
+#define OP_FUNC_VAL 0x41
+#define OP_FUNC_LEN 0x42
+#define OP_FUNC_ADR 0x43
+#define OP_FUNC_ATN 0x44
+#define OP_FUNC_COS 0x45
+#define OP_FUNC_PEEK 0x46
+#define OP_FUNC_SIN 0x47
+#define OP_FUNC_RND 0x48
+#define OP_FUNC_FRE 0x49
+#define OP_FUNC_EXP 0x4a
+#define OP_FUNC_LOG 0x4b
+#define OP_FUNC_CLOG 0x4c
+#define OP_FUNC_SQR 0x4d
+#define OP_FUNC_SGN 0x4e
+#define OP_FUNC_ABS 0x4f
+#define OP_FUNC_INT 0x50
+#define OP_FUNC_PADDLE 0x51
+#define OP_FUNC_STICK 0x52
+#define OP_FUNC_PTRIG 0x53
+#define OP_FUNC_STRIG 0x54
+
+/* variable types, bits 6-7 of byte 0 of each vvtable entry. */
+#define TYPE_SCALAR 0
+#define TYPE_ARRAY 1
+#define TYPE_STRING 2
+
+/* BASIC 14-byte header values */
+extern unsigned short lomem;
+extern unsigned short vntp;
+extern unsigned short vntd;
+extern unsigned short vvtp;
+extern unsigned short stmtab;
+extern unsigned short stmcur;
+extern unsigned short starp;
+
+/* positions where various parts of the file start,
+ derived from the header vars above. */
+extern unsigned short codestart;
+extern unsigned short save_command_pos;
+extern unsigned short save_command_tok;
+extern unsigned short code_end;
+extern unsigned short vnstart;
+extern unsigned short vvstart;
+extern int filelen;
+
+/* name of executable, taken from argv[0] */
+extern const char *self;
+
+/* entire file gets read into memory (for now) */
+extern unsigned char program[BUFSIZE];
+
+/* file handles */
+extern FILE *input_file;
+extern FILE *output_file;
+
+extern char *output_filename;
+
+extern int verbose;
+extern int allow_hex_const;
+extern int bxl_exttok_hack;
+extern int numconst_size;
+extern int error_token;
+
+extern void set_self(const char *argv0);
+extern void die(const char *msg);
+extern void parse_general_args(int argc, char **argv, void (*helpfunc)());
+extern int writefile(void);
+extern void readfile(void);
+extern unsigned short getword(int addr);
+extern void setword(int addr, int value);
+extern void dump_header_vars(void);
+extern void parse_header(void);
+extern void update_header(void);
+extern void move_code(int offset);
+extern void adjust_vntable_size(int oldsize, int newsize);
+extern int vntable_ok(void);
+extern unsigned char get_vartype(unsigned char tok);
+extern void invalid_args(const char *arg);
+extern FILE *open_file(const char *name, const char *mode);
+extern void open_input(const char *name);
+extern void open_output(const char *name);
+
+/* callback API begins here.
+ callbacks for walk_code(): */
+#define CALLBACK(x) void x(unsigned int lineno, unsigned int pos, unsigned int tok, unsigned int end)
+#define CALLBACK_PTR(x) void (*x)(unsigned int lineno, unsigned int pos, unsigned int tok, unsigned int end)
+
+/* main entry point for callback API: */
+void walk_code(unsigned int startlineno, unsigned int endlineno);
+#define walk_all_code() walk_code(0, 32768)
+
+/* available callbacks: */
+extern CALLBACK_PTR(on_start_line);
+extern CALLBACK_PTR(on_bad_line_length);
+extern CALLBACK_PTR(on_end_line);
+extern CALLBACK_PTR(on_start_stmt);
+extern CALLBACK_PTR(on_end_stmt);
+extern CALLBACK_PTR(on_cmd_token);
+extern CALLBACK_PTR(on_text);
+extern CALLBACK_PTR(on_exp_token);
+extern CALLBACK_PTR(on_var_token);
+extern CALLBACK_PTR(on_string_const);
+extern CALLBACK_PTR(on_num_const);
+extern CALLBACK_PTR(on_trailing_garbage);
diff --git a/bas2aplus.1 b/bas2aplus.1
new file mode 100644
index 0000000..722e8c2
--- /dev/null
+++ b/bas2aplus.1
@@ -0,0 +1,211 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "BAS2APLUS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+bas2aplus \- Convert Atari BASIC (and some BASIC XL/XE) programs to BASIC/A+
+.SH SYNOPSIS
+.sp
+bas2aplus \fIinput\-file\fP \fIoutput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBbas2aplus\fP reads an Atari BASIC or BASIC XL/XE tokenized (SAVEd)
+program and converts it to BASIC/A+. The conversion is a simple token
+replacement; no syntax or semantic analysis is done.
+.sp
+\fIinput\-file\fP must be an Atari BASIC, BASIC XL, or BASIC XE program.
+Turbo BASIC is not supported. Trying to convert a program that is
+already BASIC/A+ will appear to succeed, but the resulting program
+will be gibberish and will likely crash BASIC/A+ when \fBRUN\fP\&.
+.sp
+All Atari BASIC programs can be successfully converted. Some BASIC
+XL/XE tokens have no equivalent in BASIC/A+, so programs using these
+can\(aqt be converted (you will see messages on standard error, in that
+case).
+.SH OPTIONS
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH BASIC
+.sp
+BASIC/A+ is basically a later version of Atari BASIC, by the same team
+that developed Atari BASIC. As such, it\(aqs source\-compatible with Atari
+BASIC, but \fInot\fP token\-compatible.
+.sp
+BASIC/A+ uses a different set of token numbers, but has all but two
+of the same tokens used by Atari BASIC. Conversion should always
+succeed, for an Atari BASIC program.
+.sp
+The two missing tokens are the \fBCOM\fP and \fBGO TO\fP commands, which
+are converted to \fBDIM\fP and \fBGOTO\fP, respectively.
+.sp
+The resulting program should \fBLOAD\fP and \fBRUN\fP in BASIC/A+ and
+function identically to the BASIC version, unless it uses memory
+that\(aqs reserved in A+. \fBUSR()\fP routines that are stored in the lower
+half of Page 6 will have to be relocated, since A+ uses this area
+itself. See the BASIC/A+ manual for full details.
+.SH BASIC XL
+.sp
+BASIC XL is basically the next version of BASIC/A+, by the
+same developers. The token lists were rearranged so that it\(aqs
+token\-compatible with Atari BASIC, and includes all the extra
+commands/functions/etc from BASIC/A+... with different token numbers.
+.sp
+BASIC XL has keywords and operators that don\(aqt exist in BASIC/A+,
+which can\(aqt be translated by \fBbas2aplus\fP\&. These are:
+.INDENT 0.0
+.TP
+.B \fBNUM\fP
+Rarely found in a program (usually only used in direct mode).
+.TP
+.B \fBFAST\fP
+Just doesn\(aqt exist in BASIC/A+.
+.TP
+.B \fBLOCAL\fP, \fBEXIT\fP, \fBPROCEDURE\fP, \fBCALL\fP, \fBSORTUP\fP, \fBSORTDOWN\fP
+These BASIC XL commands are provided by the disk\-based Toolkit
+extension, which doesn\(aqt exist for BASIC/A+.
+.TP
+.B \fBString Arrays\fP
+BASIC/A+ doesn\(aqt support these; if your BASIC XL program uses them,
+it won\(aqt convert correctly.
+.TP
+.B \fBBUMP\fP and \fBFIND\fP
+While BASIC/A+ does support these functions, the token\-level syntax
+is different; it would be possible to translate them, but it would
+require recalculating the line offset and statement offsets for
+every line that uses them. For now, they\(aqre not supported.
+.TP
+.B \fB%\fP
+The exclusive OR operator in BASIC XL. No such animal, in A+.
+.TP
+.B \fBHEX$\fP, \fBRANDOM\fP, \fBLEFT$\fP, \fBRIGHT$\fP, \fBMID$\fP
+These functions don\(aqt exist in BASIC/A+.
+.UNINDENT
+.sp
+Also, BASIC XL supports hex constants, with a leading \fB$\fP\&. A+
+doesn\(aqt support these, so they get converted to the equivalent decimal
+constant. This is basically a cosmetic change; \fBA=$0600\fP assigns the
+same value as \fBA=1536\fP\&.
+.sp
+BASIC XL also allows some syntax that\(aqs not valid in BASIC
+A+. For instance, \fBDIR\fP is allowed with no argument in XL.
+\fBbas2aplus\fP doesn\(aqt detect these constructs.
+.SH BASIC XE
+.sp
+BASIC XE is the last in the series of OSS BASIC interpreters. It
+supports "EXTENDed" mode, which allows BASIC XE to use all the
+memory in a 130XE, but such programs are \fInot\fP supported by
+\fBbas2aplus\fP\&. Only non\-EXTENDed BASIC XE programs can be converted.
+.sp
+BASIC XE adds a few keywords to BASIC XL, which also don\(aqt exist in
+A+. These are:
+.INDENT 0.0
+.TP
+.B \fBEXTEND\fP
+This command is direct\-mode only, so it will never appear in a SAVEd
+program anyway.
+.TP
+.B \fBHITCLR\fP, \fBINVERSE\fP, \fBNORMAL\fP, \fBBLOAD\fP, \fBBSAVE\fP
+Not supported in either A+ or XL.
+.UNINDENT
+.sp
+BASIC XE also allows some syntax that\(aqs not valid in either BASIC XL
+or A+. For instance, \fBIF <condition>\fP, without \fBTHEN\fP, can appear
+as the last statement on a line, and \fBLVAR\fP no longer requires an
+argument. \fBbas2aplus\fP doesn\(aqt detect these constructs.
+.sp
+Actually, BASIC/A+ will \fBLIST\fP and \fBRUN\fP programs with the \fBIF\fP
+issue, but such lines can\(aqt be edited in A+. Easy enough to add a
+\fB:REM\fP to the end of the line, though.
+.SH TURBO BASIC
+.sp
+Not supported. It\(aqs also an extended version of Atari BASIC (by
+a different developer), but extends the syntax in ways that just
+wouldn\(aqt convert directly to BASIC/A+.
+.SH EXIT STATUS
+.sp
+0 for success, non\-zero for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/bas2aplus.c b/bas2aplus.c
new file mode 100644
index 0000000..de259aa
--- /dev/null
+++ b/bas2aplus.c
@@ -0,0 +1,272 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+
+#undef DUMP_TABLES
+
+#include "tokens.c"
+#include "aplus_tokens.c"
+#include "bxl_tokens.c"
+#include "bxe_tokens.c"
+
+int errs = 0;
+
+/* there are a few more BXL commands past 0x55, but they have no
+ A+ equivalents. */
+#define LAST_BXL_CMD 0x55
+#define LAST_BXL_OP 0x65
+
+/* cmd_table[basic_token] or op_table[basic_token] gives the equivalent
+ A+ token. note that there's no "GO TO" or "COM" in A+, we translate
+ those as GOTO and DIM. */
+unsigned char cmd_table[] = {
+ /* Atari BASIC: */
+ /* REM DATA INPUT COLOR LIST ENTER LET IF:*/
+ 0x00, 0x01, 0x02, 0x3f, 0x03, 0x04, 0x05, 0x06, /* 0x00 - 0x07 */
+
+ /* FOR NEXT GOTO GO<sp>TO GOSUB TRAP BYE CONT: */
+ 0x07, 0x08, 0x09, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, /* 0x08 - 0x0f */
+
+ /* COM CLOSE CLR DEG DIM END NEW OPEN: */
+ 0x12, 0x0f, 0x10, 0x11, 0x12, 0x19, 0x1a, 0x1b, /* 0x10 - 0x17 */
+
+ /* LOAD SAVE STATUS NOTE POINT XIO ON POKE: */
+ 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, /* 0x18 - 0x1f */
+
+ /* PRINT RAD READ RESTORE RETURN RUN STOP POP: */
+ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, /* 0x20 - 0x27 */
+
+ /* ? GET PUT GRAPHICS PLOT POSITION DOS DRAWTO: */
+ 0x2d, 0x2e, 0x2f, 0x40, 0x41, 0x42, 0x38, 0x43, /* 0x28 - 0x2f */
+
+ /* SETCOLOR LOCATE SOUND LPRINT CSAVE CLOAD <silent-let> ERROR-: */
+ 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x52, 0x53, /* 0x30 - 0x37 */
+
+ /* BASIC XL: */
+ /* WHILE ENDWHILE TRACEOFF TRACE ELSE ENDIF DPOKE LOMEM: */
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x24, 0x30, /* 0x38-0x3f */
+
+ /* DEL RPUT RGET BPUT BGET TAB CP ERASE: */
+ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x39, /* 0x40-0x47 */
+
+ /* PROTECT UNPROTECT DIR RENAME MOVE MISSILE PMCLR PMCOLOR: */
+ 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x4a, 0x4b, 0x4c, /* 0x48-0x4f */
+
+ /* PMGRAPHICS PMMOVE PMWIDTH SET LVAR RENUM: */
+ 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x0a, /* 0x50-0x55 */
+
+};
+
+/* 0xff means "untranslatable". these are:
+ BUMP( FIND( HEX$ RANDOM(
+ ...though BUMP( and FIND( do have A+ equivalents (they just need
+ a left paren inserted after) */
+unsigned char op_table[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* not used: 0x00-0x07 */
+ 0xff, 0xff, 0xff, 0xff, 0xff, /* not used: 0x08-0x0c */
+ 0x0e, /* convert BXL hex const to decimal */
+ 0x0e, 0x0f, /* numeric and string consts are the same */
+ 0xff, 0xff, /* these 2 not used: 0x10-0x11 */
+
+ /* these are the same, 0x12-0x1b */
+ 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
+
+ /* 0x1c-0x2a off by one due to USING inserted at 0x1c */
+ 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
+ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
+
+ /* 0x2b-0x43 off by 3 due to ! and & */
+ 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+ 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
+ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+ 0x46,
+
+ /* 0x44-0x50 */
+ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
+ 0x52, 0x53, 0x54, 0x55, 0x56,
+
+ /* 0x51-0x54 (last BASIC) */
+ 0x58, 0x59, 0x5a, 0x5b,
+
+ /* BXL stuff, 0x55-0x5f */
+ 0x1c, 0xff /* % */, 0x2c, 0x2d,
+ 0xff, /* string array semicolon */
+ 0xff, /* BUMP( (TODO: A+ token 0x47 plus a paren) */
+ 0xff, /* FIND( (TODO: A+ token 0x48 plus a paren) */
+ 0xff, /* HEX$ */
+ 0xff, /* RANDOM( */
+ 0x49, /* DPEEK */
+ 0x57, /* SYS */
+ 0x5c, /* VSTICK */
+ 0x5d, /* HSTICK */
+ 0x5e, /* PMADR */
+ 0x5f, /* ERR */
+ 0x60, /* TAB */
+ 0x61, /* PEN */
+
+};
+
+#ifdef DUMP_TABLES
+void dump_tables(void) {
+ int i;
+
+ for(i = 0; i <= LAST_BXL_CMD; i++) {
+ const char *b, *ap = aplus_cmds[cmd_table[i]];
+ if(i <= last_command)
+ b = commands[i];
+ else
+ b = bxl_cmds[i - 0x38];
+ printf("%02x: %s %s%s\n", i, b, ap, (strcmp(b, ap) == 0) ? " SAME" : "");
+ }
+
+ printf("\n\n");
+
+ for(i = 0x12; i <= LAST_BXL_OP; i++) {
+ int j = op_table[i];;
+ const char *b, *ap;
+ if(j == 0xff)
+ ap = "(not in A+)";
+ else
+ ap = aplus_ops[j];
+ if(i <= last_operator)
+ b = operators[i];
+ else
+ b = bxl_ops[i - 0x55];
+ printf("%02x: %s %s%s\n", i, b, ap, (strcmp(b, ap) == 0) ? " SAME" : "");
+ }
+}
+#endif
+
+void print_help(void) {
+ printf("%s [input-file] [output-file]\n", self);
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "v")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 'h': print_help(); exit(0);
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(optind == argc)
+ die("No input file given.");
+ else
+ open_input(argv[optind]);
+
+ if(++optind == argc)
+ die("No output file given.");
+ else
+ output_filename = argv[optind];
+
+ if(argv[++optind])
+ die("Only one input and one output file allowed.");
+}
+
+const char *get_tok_name(unsigned char tok, int is_cmd) {
+ if(is_cmd) {
+ if(tok <= last_command) {
+ return commands[tok];
+ } else if(tok == 0x5a) {
+ return "BASIC XL LOCAL/EXIT/PROCEDURE/CALL/SORTUP/SORTDOWN";
+ } else if(tok == 0x59 || (tok > 0x5a && tok < 0x65)) {
+ return bxe_cmds[tok - 0x57];
+ } else if(tok > last_command && tok <= 0x58) {
+ return bxl_cmds[tok - 0x38];
+ } else {
+ return "(maybe Turbo BASIC?)";
+ }
+ } else {
+ if(tok < 0x12) return "";
+ if(tok <= last_operator) {
+ return operators[tok];
+ } else if(tok <= 0x68) {
+ return bxl_ops[tok - 0x55];
+ } else {
+ return "(maybe Turbo BASIC?)";
+ }
+ }
+}
+
+void unsupported_msg(unsigned char tok, int lineno, int is_cmd) {
+ fprintf(stderr, "%s: Invalid %s \"%s\" ($%02x) at line %d, not converted.\n",
+ self, is_cmd ? "command" : "operator", get_tok_name(tok, is_cmd), tok, lineno);
+ errs++;
+}
+
+int is_supported_cmd(unsigned char tok, int lineno) {
+ if(tok > LAST_BXL_CMD) {
+ unsupported_msg(tok, lineno, 1);
+ return 0;
+ }
+ return 1;
+}
+
+int is_supported_op(unsigned char tok, int lineno) {
+ if(tok > LAST_BXL_OP || op_table[tok] == 0xff) {
+ unsupported_msg(tok, lineno, 0);
+ return 0;
+ }
+ return 1;
+}
+
+CALLBACK(conv_cmd) {
+ if(!is_supported_cmd(tok, lineno))
+ return;
+
+ program[pos] = cmd_table[tok];
+
+ if(verbose && tok != program[pos])
+ fprintf(stderr, "command \"%s\" ($%02x) converted to $%02x at line %d, pos $%04x\n",
+ get_tok_name(tok, 1), tok, program[pos], lineno, pos);
+}
+
+CALLBACK(conv_op) {
+ if(!is_supported_op(tok, lineno))
+ return;
+
+ program[pos] = op_table[tok];
+
+ if(verbose && tok != program[pos])
+ fprintf(stderr, "operator \"%s\" ($%02x) converted to $%02x at line %d, pos $%04x\n",
+ get_tok_name(tok, 0), tok, program[pos], lineno, pos);
+}
+
+int main(int argc, char **argv) {
+#ifdef DUMP_TABLES
+ dump_tables(); exit(0);
+#endif
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+
+ on_cmd_token = conv_cmd;
+ on_exp_token = conv_op;
+
+ allow_hex_const = 1;
+ walk_all_code();
+
+ open_output(output_filename);
+ writefile();
+
+ if(errs) {
+ fprintf(stderr, "%s: program has %d invalid tokens; BASIC/A+ won't RUN it.\n",
+ self, errs);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/bas2aplus.rst b/bas2aplus.rst
new file mode 100644
index 0000000..4ce3f50
--- /dev/null
+++ b/bas2aplus.rst
@@ -0,0 +1,143 @@
+=========
+bas2aplus
+=========
+
+---------------------------------------------------------------
+Convert Atari BASIC (and some BASIC XL/XE) programs to BASIC/A+
+---------------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+bas2aplus *input-file* *output-file*
+
+DESCRIPTION
+===========
+
+**bas2aplus** reads an Atari BASIC or BASIC XL/XE tokenized (SAVEd)
+program and converts it to BASIC/A+. The conversion is a simple token
+replacement; no syntax or semantic analysis is done.
+
+*input-file* must be an Atari BASIC, BASIC XL, or BASIC XE program.
+Turbo BASIC is not supported. Trying to convert a program that is
+already BASIC/A+ will appear to succeed, but the resulting program
+will be gibberish and will likely crash BASIC/A+ when **RUN**.
+
+All Atari BASIC programs can be successfully converted. Some BASIC
+XL/XE tokens have no equivalent in BASIC/A+, so programs using these
+can't be converted (you will see messages on standard error, in that
+case).
+
+OPTIONS
+=======
+
+.. include:: genopts.rst
+
+BASIC
+=====
+
+BASIC/A+ is basically a later version of Atari BASIC, by the same team
+that developed Atari BASIC. As such, it's source-compatible with Atari
+BASIC, but *not* token-compatible.
+
+BASIC/A+ uses a different set of token numbers, but has all but two
+of the same tokens used by Atari BASIC. Conversion should always
+succeed, for an Atari BASIC program.
+
+The two missing tokens are the **COM** and **GO TO** commands, which
+are converted to **DIM** and **GOTO**, respectively.
+
+The resulting program should **LOAD** and **RUN** in BASIC/A+ and
+function identically to the BASIC version, unless it uses memory
+that's reserved in A+. **USR()** routines that are stored in the lower
+half of Page 6 will have to be relocated, since A+ uses this area
+itself. See the BASIC/A+ manual for full details.
+
+BASIC XL
+========
+
+BASIC XL is basically the next version of BASIC/A+, by the
+same developers. The token lists were rearranged so that it's
+token-compatible with Atari BASIC, and includes all the extra
+commands/functions/etc from BASIC/A+... with different token numbers.
+
+BASIC XL has keywords and operators that don't exist in BASIC/A+,
+which can't be translated by **bas2aplus**. These are:
+
+**NUM**
+ Rarely found in a program (usually only used in direct mode).
+
+**FAST**
+ Just doesn't exist in BASIC/A+.
+
+**LOCAL**, **EXIT**, **PROCEDURE**, **CALL**, **SORTUP**, **SORTDOWN**
+ These BASIC XL commands are provided by the disk-based Toolkit
+ extension, which doesn't exist for BASIC/A+.
+
+**String Arrays**
+ BASIC/A+ doesn't support these; if your BASIC XL program uses them,
+ it won't convert correctly.
+
+**BUMP** and **FIND**
+ While BASIC/A+ does support these functions, the token-level syntax
+ is different; it would be possible to translate them, but it would
+ require recalculating the line offset and statement offsets for
+ every line that uses them. For now, they're not supported.
+
+**%**
+ The exclusive OR operator in BASIC XL. No such animal, in A+.
+
+**HEX$**, **RANDOM**, **LEFT$**, **RIGHT$**, **MID$**
+ These functions don't exist in BASIC/A+.
+
+Also, BASIC XL supports hex constants, with a leading **$**. A+
+doesn't support these, so they get converted to the equivalent decimal
+constant. This is basically a cosmetic change; **A=$0600** assigns the
+same value as **A=1536**.
+
+BASIC XL also allows some syntax that's not valid in BASIC
+A+. For instance, **DIR** is allowed with no argument in XL.
+**bas2aplus** doesn't detect these constructs.
+
+BASIC XE
+========
+
+BASIC XE is the last in the series of OSS BASIC interpreters. It
+supports "EXTENDed" mode, which allows BASIC XE to use all the
+memory in a 130XE, but such programs are *not* supported by
+**bas2aplus**. Only non-EXTENDed BASIC XE programs can be converted.
+
+BASIC XE adds a few keywords to BASIC XL, which also don't exist in
+A+. These are:
+
+**EXTEND**
+ This command is direct-mode only, so it will never appear in a SAVEd
+ program anyway.
+
+**HITCLR**, **INVERSE**, **NORMAL**, **BLOAD**, **BSAVE**
+ Not supported in either A+ or XL.
+
+BASIC XE also allows some syntax that's not valid in either BASIC XL
+or A+. For instance, **IF <condition>**, without **THEN**, can appear
+as the last statement on a line, and **LVAR** no longer requires an
+argument. **bas2aplus** doesn't detect these constructs.
+
+Actually, BASIC/A+ will **LIST** and **RUN** programs with the **IF**
+issue, but such lines can't be edited in A+. Easy enough to add a
+**:REM** to the end of the line, though.
+
+TURBO BASIC
+===========
+
+Not supported. It's also an extended version of Atari BASIC (by
+a different developer), but extends the syntax in ways that just
+wouldn't convert directly to BASIC/A+.
+
+EXIT STATUS
+===========
+
+0 for success, non-zero for failure.
+
+.. include:: manftr.rst
diff --git a/bcdfp.c b/bcdfp.c
new file mode 100644
index 0000000..a80e55d
--- /dev/null
+++ b/bcdfp.c
@@ -0,0 +1,74 @@
+#include <string.h>
+#include <stdio.h>
+#include "bcdfp.h"
+
+/* very dumb and limited BCD floating point conversions.
+ they're written this way because they're only required to
+ support line numbers, and I don't want to have to link with
+ the math library (-lm). */
+
+extern void die(const char *msg);
+
+void die_range(void) {
+ die("Line number out of range (>65535)");
+}
+
+unsigned char bcd2int(unsigned char bcd) {
+ return (bcd >> 4) * 10 + (bcd & 0x0f);
+}
+
+unsigned char int2bcd(unsigned char i) {
+ return ((i / 10) << 4) | (i % 10);
+}
+
+unsigned short fp2int(const unsigned char *fp) {
+ unsigned int result = 0;
+
+ /* examine the exponent/sign byte */
+ if(fp[0] == 0) return 0; /* special case */
+ if(fp[0] & 0x80) die("Negative line numbers not supported");
+
+ switch(fp[0]) {
+ case 0x40:
+ result = bcd2int(fp[1]);
+ if(fp[2] >= 0x50) result++;
+ break;
+ case 0x41:
+ result = bcd2int(fp[1]) * 100 + bcd2int(fp[2]);
+ if(fp[3] >= 0x50) result++;
+ break;
+ case 0x42:
+ result = bcd2int(fp[1]) * 10000 + bcd2int(fp[2]) * 100 + bcd2int(fp[3]);
+ if(fp[4] >= 0x50) result++;
+ break;
+ default:
+ die_range(); break;
+ }
+
+ if(result > 0xffff) die_range();
+
+ return (unsigned short)result;
+}
+
+void int2fp(unsigned short num, unsigned char *fp) {
+ memset(fp, 0, 6);
+
+ if(num == 0) return;
+
+ if(num >= 10000) {
+ fp[0] = 0x42;
+ fp[3] = int2bcd(num % 100);
+ num /= 100;
+ fp[2] = int2bcd(num % 100);
+ num /= 100;
+ fp[1] = int2bcd(num);
+ } else if(num >= 100) {
+ fp[0] = 0x41;
+ fp[2] = int2bcd(num % 100);
+ num /= 100;
+ fp[1] = int2bcd(num);
+ } else {
+ fp[0] = 0x40;
+ fp[1] = int2bcd(num);
+ }
+}
diff --git a/bcdfp.h b/bcdfp.h
new file mode 100644
index 0000000..a640122
--- /dev/null
+++ b/bcdfp.h
@@ -0,0 +1,4 @@
+unsigned char bcd2int(unsigned char bcd);
+unsigned char int2bcd(unsigned char i);
+unsigned short fp2int(const unsigned char *fp);
+void int2fp(unsigned short num, unsigned char *fp);
diff --git a/blob2c.1 b/blob2c.1
index f59dbe2..32ee530 100644
--- a/blob2c.1
+++ b/blob2c.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "BLOB2C" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "BLOB2C" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
blob2c \- Create C source and header files from a binary file
.\" RST source for blob2c(1) man page. Convert with:
@@ -116,25 +116,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/blob2xex.1 b/blob2xex.1
index a13f982..377d792 100644
--- a/blob2xex.1
+++ b/blob2xex.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "BLOB2XEX" 1 "2024-05-17" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "BLOB2XEX" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
blob2xex \- Create Atari 8-bit executables from arbitrary data
.\" RST source for blob2xex(1) man page. Convert with:
@@ -207,25 +207,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/bxe_tokens.c b/bxe_tokens.c
new file mode 100644
index 0000000..5189ee0
--- /dev/null
+++ b/bxe_tokens.c
@@ -0,0 +1,19 @@
+/* BXL and BXE token tables are identical up to 0x56 */
+const char *bxe_cmds[] = {
+ "LOCAL", /* $57 */
+ "EXTEND", /* $58 */
+ "PROCEDURE", /* $59 */
+ 0, /* $5A */
+ "CALL", /* $5B */
+ "SORTUP", /* $5C */
+ "SORTDOWN", /* $5D */
+ "EXIT", /* $5E */
+ "NUM", /* $5F */
+ "HITCLR", /* $60 */
+ "INVERSE", /* $61 */
+ "NORMAL", /* $62 */
+ "BLOAD", /* $63 */
+ "BSAVE" /* $64 */
+};
+
+const int bxe_cmd_size = sizeof(bxe_cmds);
diff --git a/bxe_tokens.h b/bxe_tokens.h
new file mode 100644
index 0000000..25bc14a
--- /dev/null
+++ b/bxe_tokens.h
@@ -0,0 +1,2 @@
+extern const char *bxe_cmds[];
+extern const int bxe_cmd_size;
diff --git a/bxl_tokens.c b/bxl_tokens.c
new file mode 100644
index 0000000..3543f11
--- /dev/null
+++ b/bxl_tokens.c
@@ -0,0 +1,64 @@
+const char *bxl_cmds[] = {
+ "WHILE", /* $38 */
+ "ENDWHILE", /* $39 */
+ "TRACEOFF", /* $3A */
+ "TRACE", /* $3B */
+ "ELSE", /* $3C */
+ "ENDIF", /* $3D */
+ "DPOKE", /* $3E */
+ "LOMEM", /* $3F */
+ "DEL", /* $40 */
+ "RPUT", /* $41 */
+ "RGET", /* $42 */
+ "BPUT", /* $43 */
+ "BGET", /* $44 */
+ "TAB", /* $45 */
+ "CP", /* $46 */
+ "ERASE", /* $47 */
+ "PROTECT", /* $48 */
+ "UNPROTECT", /* $49 */
+ "DIR", /* $4A */
+ "RENAME", /* $4B */
+ "MOVE", /* $4C */
+ "MISSILE", /* $4D */
+ "PMCLR", /* $4E */
+ "PMCOLOR", /* $4F */
+ "PMGRAPHICS", /* $50 */
+ "PMMOVE", /* $51 */
+ "PMWIDTH", /* $52 */
+ "SET", /* $53 */
+ "LVAR", /* $54 */
+ "RENUM", /* $55 */
+ "FAST", /* $56 */
+ "NUM", /* $57 */
+ "END", /* $58 */
+ 0, /* $59 */
+ "", /* $5A, disk extensions */
+};
+
+const int bxl_cmd_size = sizeof(bxl_cmds);
+
+const char *bxl_ops[] = {
+ " USING ", /* $55 */
+ "%", /* $56 */
+ "!", /* $57 */
+ "&", /* $58 */
+ ";", /* $59 */
+ "BUMP(", /* $5A */
+ "FIND(", /* $5B */
+ "HEX$", /* $5C */
+ "RANDOM(", /* $5D */
+ "DPEEK", /* $5E */
+ "SYS", /* $5F */
+ "VSTICK", /* $60 */
+ "HSTICK", /* $61 */
+ "PMADR", /* $62 */
+ "ERR", /* $63 */
+ "TAB", /* $64 */
+ "PEN", /* $65 */
+ "LEFT$(", /* $66 */
+ "RIGHT$(", /* $67 */
+ "MID$(", /* $68 */
+};
+
+const int bxl_ops_size = sizeof(bxl_ops);
diff --git a/bxl_tokens.h b/bxl_tokens.h
new file mode 100644
index 0000000..b769038
--- /dev/null
+++ b/bxl_tokens.h
@@ -0,0 +1,5 @@
+extern const char *bxl_cmds[];
+extern const int bxl_cmd_size;
+
+extern const char *bxl_ops[];
+extern const int bxl_ops_size;
diff --git a/cart2xex.1 b/cart2xex.1
index 19ea56b..8c18e08 100644
--- a/cart2xex.1
+++ b/cart2xex.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "CART2XEX" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "CART2XEX" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
cart2xex \- Convert an Atari 8-bit ROM cartridge image to a binary load file
.\" RST source for cart2xex(1) man page. Convert with:
@@ -65,9 +65,8 @@ Print help (usage) message and exit.
Sets the init address of the executable. Default is to use the
init address in the ROM image, at addresses $BFFE/BFFF. An init
address of zero means "no init address"; in this case, the output
-won\(aqt contain an init address at all. Executables created
-with this option probably won\(aqt run without further modifica‐
-tions.
+won\(aqt contain an init address at all. Executables created
+with this option probably won\(aqt run without further modifications.
.TP
.BI \-l \ address
Sets the load address of the executable. Default is to use the
@@ -226,25 +225,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/cart2xex.rst b/cart2xex.rst
index aff6272..db6d967 100644
--- a/cart2xex.rst
+++ b/cart2xex.rst
@@ -45,9 +45,8 @@ OPTIONS
Sets the init address of the executable. Default is to use the
init address in the ROM image, at addresses $BFFE/BFFF. An init
address of zero means "no init address"; in this case, the output
- won't contain an init address at all. Executables created
- with this option probably won't run without further modifica‐
- tions.
+ won't contain an init address at all. Executables created
+ with this option probably won't run without further modifications.
-l address
Sets the load address of the executable. Default is to use the
diff --git a/colorize-amsb b/colorize-amsb
new file mode 100755
index 0000000..4d6c616
--- /dev/null
+++ b/colorize-amsb
@@ -0,0 +1,284 @@
+#!/usr/bin/perl -w
+
+# colorize output from listbas... *after* it's been converted to utf8
+# with a8cat, including ANSI codes for reverse/normal video.
+
+($SELF = $0) =~ s,.*/,,;
+
+%colornames = (
+ none => 0,
+ red => 1,
+ green => 2,
+ yellow => 3,
+ blue => 4,
+ purple => 5,
+ cyan => 6,
+);
+
+%colors = (
+ numbers => 'red',
+ commands => 'yellow',
+ functions => 'purple',
+ linenumbers => 'cyan',
+ comments => 'blue',
+ variables => 'none',
+ operators => 'green',
+ strings => 'red',
+);
+
+@commands = qw/
+ END FOR NEXT READ DATA RESTORE LINE INPUT DEFSTR DEFINT DEFDBL DEFSNG
+ OPTION DIM COMMON DEF LET RANDOMIZE GOTO GOSUB RETURN GO RUN IF
+ ELSE THEN STOP CONT RESUME ERROR ON AFTER POKE WAIT MOVE LOAD SAVE
+ VERIFY MERGE PRINT PRINT LIST AUTO DEL TRON TROFF RENUM OPEN CLOSE
+ GET PUT NOTE LOCK UNLOCK KILL NAME GRAPHICS COLOR PLOT FILL SETCOLOR
+ SOUND CLS DOS CLEAR NEW CLOAD CSAVE BASE TO SUB NOT STEP ALL USING
+ RESERVE UPDATE OUTPUT APPEND AT PLM0 PLM2 PLM1 CHR0 CHR1 CHR2 AND
+ OR XOR
+/;
+
+@functions = qw/
+ TAB SPC AT SGN INT ABS FRE POS SQR LOG EXP COS SIN TAN ATN PEEK LEN STR
+ VAL ASC CHR STATUS EOF LEFT RIGHT MID INSTR STRING VARPTR USR SCRN RND
+ TIME INKEY ERR ERL STACK
+/;
+
+$cmdhash{$_}++ for @commands;
+$funchash{$_}++ for @functions;
+
+sub conf_file_name {
+ my $home = $ENV{HOME};
+ if(!defined $home) {
+ warn "$SELF: HOME not set in environment, not reading config file\n";
+ return undef;
+ }
+ return $home . '/.colorize-amsb.conf';
+}
+
+sub read_config {
+ my $file = conf_file_name();
+ return 1 if !defined $file; # caller won't create
+ open my $fh, '<', $file or return 0; # not found, caller will create
+
+ while(<$fh>) {
+ chomp;
+ s/#.*//;
+ next if /^\s*$/;
+ s/^\s*//;
+ s/\s*$//;
+ $_ = lc $_;
+ if(/^([a-z]+)[^a-z]+([a-z]+)*$/) {
+ my($k, $v) = ($1, $2);
+ if(!defined $colors{$k}) {
+ warn "$SELF: $file:$.: unknown color type '$k', ignoring\n";
+ } elsif(!defined $colornames{$v}) {
+ warn "$SELF: $file:$.: unknown color name '$v', ignoring\n";
+ } else {
+ $colors{$k} = $v;
+ }
+ } else {
+ warn "$SELF: $file:$.: malformed line, skipping\n";
+ }
+ }
+
+ close $fh;
+}
+
+sub create_config {
+ my $file = conf_file_name();
+ return unless defined $file;
+ open my $fh, '>', $file or do {
+ warn "$SELF: can't create $file: $!\n";
+ return;
+ };
+
+ my $types = join(" ", sort keys %colors);
+ my $names = join(" ", sort keys %colornames);
+
+ print $fh <<EOF;
+# colorize-amsb.conf
+
+# lines with # are comments. blank lines are ignored.
+
+# each line is "type = color", where valid types are:
+# $types
+# and valid colors are:
+# $names
+
+EOF
+
+ for(sort keys %colors) {
+ print $fh '#' . $_ . ' = ' . $colors{$_} . "\n";
+ }
+
+ close $fh;
+}
+
+sub is_cmd {
+ return $cmdhash{$_[0]};
+}
+
+sub is_func {
+ return $funchash{$_[0]};
+}
+
+sub is_punct {
+ for($_[0]) {
+ return 0 if length > 1;
+ return 0 if /[\sA-Za-z0-9]/;
+ }
+ return 1;
+}
+
+sub is_varname {
+ return $_[0] =~ /^[A-Z]/;
+}
+
+sub start_color {
+ my $color = shift;
+ my $colortype = $colors{$color} || die "invalid color type $color\n";
+ my $colornum = $colornames{$colortype};
+ die "invalid color name $color\n" unless defined $colornum;
+ if($colornum) {
+ print "\x1b[3" . $colornum . "m";
+ }
+}
+
+sub end_color {
+ print "\x1b[0m";
+}
+
+sub colorize {
+ my $color = shift;
+ my $text = shift;
+ #warn "color $color, text '$text'\n";
+ start_color($color) if $color;
+ print $text;
+ end_color if $color;
+}
+
+sub colorize_line {
+ my $line = shift;
+
+ # skip initial blank line (or really any blank lines)
+ return unless length $line;
+
+ # split on non-word characters, capturing the delimiters.
+ # spliting this: 10 PRINT "HELLO":A=1.0E+10:END
+ # ...gives this set of tokens:
+ # 10
+ # <space>
+ # PRINT
+ # <space>
+ # "
+ # HELLO
+ # "
+ # :
+ # 1
+ # .
+ # 0E
+ # +
+ # 10
+ # :
+ # END
+
+ @toks = (split(/(\W)/, $line));
+
+ # special case the line number
+ my $tok = shift @toks;
+ if($tok =~ /^\d+/) {
+ colorize('linenumbers', $tok);
+ } else {
+ die "$SELF: no line number at line $., not LISTed AMSB?\n";
+ }
+
+ my $lasttok = '';
+ my $lastcolor = 0;
+ my $in_comment = 0;
+ my $in_string = 0;
+
+ # iterate over the rest of the tokens. kinda hairy, sorry.
+ for my $tok (@toks) {
+ my $color = 0;
+
+ if($in_comment || $in_string) {
+ $color = 0;
+ if($in_string && $tok eq '"') {
+ $in_string = 0;
+ $color = 'operators';
+ }
+ } elsif($tok =~ /^REM|!|'/) {
+ start_color('comments'); # rest of line
+ $in_comment = 1;
+ } elsif($tok eq '"') {
+ $color = 'operators';
+ $in_string = 1;
+ } elsif($tok eq '#') {
+ if($lastcolor eq 'variables') {
+ # double-precision variable
+ $color = 'variables';
+ } else {
+ # OPEN #, PRINT #, CLOSE #, etc
+ $color = 'operators';
+ }
+ } elsif($tok eq '%') {
+ # integer variable
+ $color = 'variables';
+ } elsif($tok eq '#' && $lastcolor eq 'variables') {
+ # double-precision variable
+ $color = 'variables';
+ } elsif($tok eq '$') {
+ # $ takes either the functions or variables color
+ $color = $lastcolor;
+ } elsif($tok eq '.') {
+ # decimal point only appears in a number
+ $color = 'numbers';
+ } elsif(($tok eq '-' || $tok eq '+') && $lasttok =~ /^\d+E$/) {
+ # scientific notation (entire number is the same color)
+ $color = 'numbers';
+ } elsif($tok eq '&') {
+ # hex constant operator
+ $color = 'numbers';
+ } elsif($lasttok eq '&') {
+ # hex constant argument
+ $color = 'numbers';
+ } elsif(is_cmd($tok)) {
+ $color = 'commands';
+ } elsif(is_func($tok)) {
+ $color = 'functions';
+ } elsif(is_punct($tok)) {
+ $color = 'operators';
+ } elsif(is_varname($tok)) {
+ $color = 'variables';
+ } else {
+ $color = 'numbers';
+ }
+
+ # if $color == 0, colorize() just prints the token without escape codes.
+ colorize($color, $tok);
+
+ # if we just started a string, set the strings color.
+ if($tok eq '"' && $in_string) {
+ start_color('strings');
+ }
+ $lastcolor = $color;
+ $lasttok = $tok;
+ }
+
+ # don't leave the text color enabled at the end of the line.
+ end_color() if $in_comment || $in_string;
+}
+
+# main()
+binmode(STDIN, ":utf8");
+binmode(STDOUT, ":utf8");
+
+if(!read_config()) {
+ create_config();
+}
+
+while(<>) {
+ chomp;
+ colorize_line($_);
+ print "\n";
+}
diff --git a/colorize-amsb.1 b/colorize-amsb.1
new file mode 100644
index 0000000..f18143d
--- /dev/null
+++ b/colorize-amsb.1
@@ -0,0 +1,100 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "COLORIZE-AMSB" 1 "2025-03-16" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+colorize-amsb \- color syntax highlighting for detokenized Atari MS BASIC
+.SH SYNOPSIS
+.sp
+\fBcolorize\-amsb\fP [\fBfile\fP]
+.SH DESCRIPTION
+.sp
+\fBcolorize\-amsb\fP is a filter that postprocesses the LISTed output
+of \fBlistamsb\fP, after it has been piped through \fBa8cat\fP\&. Normally,
+there\(aqs no need to run \fBcolorize\-amsb\fP explicitly, as it\(aqs called by
+\fBlistamsb\fP automatically.
+.sp
+\fBcolorize\-amsb\fP takes no options.
+.SH CONFIGURATION
+.sp
+The colors are controlled by the config file, \fB~/.colorize\-amsb.conf\fP\&.
+.sp
+If the file doesn\(aqt exist, \fBcolorize\-amsb\fP creates it, with all
+options commented out. See the comments in the file for the syntax.
+.SH EXIT STATUS
+.sp
+0 for success, non\-zero for any error. Error messages are printed to \fBstderr\fP\&.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/colorize-amsb.rst b/colorize-amsb.rst
new file mode 100644
index 0000000..b680b31
--- /dev/null
+++ b/colorize-amsb.rst
@@ -0,0 +1,39 @@
+=============
+colorize-amsb
+=============
+
+--------------------------------------------------------
+color syntax highlighting for detokenized Atari MS BASIC
+--------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+**colorize-amsb** [**file**]
+
+DESCRIPTION
+===========
+
+**colorize-amsb** is a filter that postprocesses the LISTed output
+of **listamsb**, after it has been piped through **a8cat**. Normally,
+there's no need to run **colorize-amsb** explicitly, as it's called by
+**listamsb** automatically.
+
+**colorize-amsb** takes no options.
+
+CONFIGURATION
+=============
+
+The colors are controlled by the config file, **~/.colorize-amsb.conf**.
+
+If the file doesn't exist, **colorize-amsb** creates it, with all
+options commented out. See the comments in the file for the syntax.
+
+EXIT STATUS
+===========
+
+0 for success, non-zero for any error. Error messages are printed to **stderr**.
+
+.. include:: manftr.rst
diff --git a/cxrefbas.1 b/cxrefbas.1
new file mode 100644
index 0000000..91fc308
--- /dev/null
+++ b/cxrefbas.1
@@ -0,0 +1,194 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "CXREFBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+cxrefbas \- Code cross-reference for tokenized Atari 8-bit BASIC files
+.SH SYNOPSIS
+.sp
+cxrefbas [\fB\-v\fP] \fBinput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBcxrefbas\fP reads an Atari 8\-bit BASIC tokenized program. For each
+line number in the program, it prints a list of lines that reference
+it.
+.sp
+\fBinput\-file\fP must be a tokenized (SAVEd) Atari BASIC program. Use
+\fI\-\fP to read from standard input, but \fBcxrefbas\fP will refuse to read
+from standard input if it\(aqs a terminal.
+.sp
+Each line number reference in the output is followed by a letter that
+indicates the type of reference:
+.INDENT 0.0
+.TP
+.B \fBG\fP
+\fIGOTO\fP (without \fION\fP) or \fIGO TO\fP\&.
+.TP
+.B \fBS\fP
+\fIGOSUB\fP (without \fION\fP).
+.TP
+.B \fBI\fP
+\fIIF\fP with line number only, e.g. \fIIF X THEN 1000\fP\&.
+.TP
+.B \fBO\fP
+\fION/GOTO\fP or \fION/GOSUB\fP\&.
+.TP
+.B \fBR\fP
+\fIRESTORE\fP\&.
+.TP
+.B \fBT\fP
+\fITRAP\fP\&.
+.TP
+.B \fBL\fP
+\fILIST\fP\&. It\(aqs very rare for a program to \fILIST\fP parts of itself, but
+it\(aqs allowed by BASIC so it\(aqs supported here.
+.UNINDENT
+.sp
+If a line doesn\(aqt exist, but is referenced (e.g. \fIGOTO 100\fP, but there
+is no line 100), it\(aqs printed in the table, prefixed with \fI!\fP\&.
+.sp
+Any command that uses a computed value for a line number will print a
+warning on standard error, e.g. \fIGOTO A\fP or \fIGOSUB 100*A\fP\&. Even \fIGOTO
+100+0\fP is a computed value, since BASIC doesn\(aqt do constant folding.
+.sp
+Line numbers above 32767, e.g. \fITRAP 40000\fP, are not listed.
+.sp
+Atari BASIC allows fractional line numbers, such as \fIGOTO 123.4\fP\&.
+These are rounded to the nearest integer when the program is
+executed. \fBcxrefbas\fP handles these correctly, although you\(aqre
+not likely to run into them in real\-world programs.
+.SH OPTIONS
+.sp
+There are no application\-specific options.
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH EXAMPLE
+.sp
+This program:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 GOSUB 100:GOSUB 200
+100 RESTORE 1000:IF A THEN 120
+110 GOTO 200
+120 ON B GOTO 300,310,320
+200 RETURN
+300 PRINT 1
+310 PRINT 2
+1000 DATA XYZ
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Produces this output:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+100: 10:S
+120: 100:I
+200: 10:S 110:G
+300: 120:O
+310: 120:O
+!320: 120:O
+1000: 100:R
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Note that line 320 doesn\(aqt exist in the program, so it\(aqs shown with
+\fI!\fP in the output. Line 120 has \fI100:I\fP; if the \fITHEN 120\fP were
+changed to \fITHEN GOTO 120\fP, line 120 would read \fI100:G\fP\&.
+.SH EXIT STATUS
+.sp
+0 for success, 1 for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/cxrefbas.c b/cxrefbas.c
new file mode 100644
index 0000000..8a7f8c1
--- /dev/null
+++ b/cxrefbas.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+#include "bcdfp.h"
+#include "linetab.h"
+
+void print_ref_table(void) {
+ char c;
+ int i, j;
+ for(i = 0; i < 32768; i++) {
+ if(refcounts[i]) {
+ if(!lines_exist[i]) putchar('!');
+ printf("%d: ", i);
+ for(j = 0; j < refcounts[i]; j++) {
+ printf("%d:", linerefs[i][j].lineno);
+ switch(linerefs[i][j].cmd) {
+ case CMD_GOTO: c = 'G'; break;
+ case CMD_GO_TO: c = 'G'; break;
+ case CMD_GOSUB: c = 'S'; break;
+ case CMD_RESTORE: c = 'R'; break;
+ case CMD_TRAP: c = 'T'; break;
+ case CMD_IF: c = 'I'; break;
+ case CMD_ON: c = 'O'; break;
+ case CMD_LIST: c = 'L'; break;
+ default: c = '?'; break;
+ }
+ putchar(c);
+ putchar(' ');
+ }
+ putchar('\n');
+ }
+ }
+}
+
+void print_help(void) {
+ printf("Usage: %s [-v] program.bas\n", self);
+ exit(0);
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "v")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ default: print_help(); exit(1);
+ }
+ }
+
+ if(optind >= argc)
+ die("No input file given (use - for stdin).");
+ else
+ open_input(argv[optind]);
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+
+ build_ref_table();
+ print_ref_table();
+ free_ref_table();
+
+ return 0;
+}
diff --git a/cxrefbas.rst b/cxrefbas.rst
new file mode 100644
index 0000000..7004217
--- /dev/null
+++ b/cxrefbas.rst
@@ -0,0 +1,106 @@
+========
+cxrefbas
+========
+
+----------------------------------------------------------
+Code cross-reference for tokenized Atari 8-bit BASIC files
+----------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+cxrefbas [**-v**] **input-file**
+
+DESCRIPTION
+===========
+
+**cxrefbas** reads an Atari 8-bit BASIC tokenized program. For each
+line number in the program, it prints a list of lines that reference
+it.
+
+**input-file** must be a tokenized (SAVEd) Atari BASIC program. Use
+*-* to read from standard input, but **cxrefbas** will refuse to read
+from standard input if it's a terminal.
+
+Each line number reference in the output is followed by a letter that
+indicates the type of reference:
+
+**G**
+ *GOTO* (without *ON*) or *GO TO*.
+
+**S**
+ *GOSUB* (without *ON*).
+
+**I**
+ *IF* with line number only, e.g. *IF X THEN 1000*.
+
+**O**
+ *ON/GOTO* or *ON/GOSUB*.
+
+**R**
+ *RESTORE*.
+
+**T**
+ *TRAP*.
+
+**L**
+ *LIST*. It's very rare for a program to *LIST* parts of itself, but
+ it's allowed by BASIC so it's supported here.
+
+If a line doesn't exist, but is referenced (e.g. *GOTO 100*, but there
+is no line 100), it's printed in the table, prefixed with *!*.
+
+Any command that uses a computed value for a line number will print a
+warning on standard error, e.g. *GOTO A* or *GOSUB 100\*A*. Even *GOTO
+100+0* is a computed value, since BASIC doesn't do constant folding.
+
+Line numbers above 32767, e.g. *TRAP 40000*, are not listed.
+
+Atari BASIC allows fractional line numbers, such as *GOTO 123.4*.
+These are rounded to the nearest integer when the program is
+executed. **cxrefbas** handles these correctly, although you're
+not likely to run into them in real-world programs.
+
+OPTIONS
+=======
+
+There are no application-specific options.
+
+.. include:: genopts.rst
+
+EXAMPLE
+=======
+
+This program::
+
+ 10 GOSUB 100:GOSUB 200
+ 100 RESTORE 1000:IF A THEN 120
+ 110 GOTO 200
+ 120 ON B GOTO 300,310,320
+ 200 RETURN
+ 300 PRINT 1
+ 310 PRINT 2
+ 1000 DATA XYZ
+
+Produces this output::
+
+ 100: 10:S
+ 120: 100:I
+ 200: 10:S 110:G
+ 300: 120:O
+ 310: 120:O
+ !320: 120:O
+ 1000: 100:R
+
+Note that line 320 doesn't exist in the program, so it's shown with
+*!* in the output. Line 120 has *100:I*; if the *THEN 120* were
+changed to *THEN GOTO 120*, line 120 would read *100:G*.
+
+EXIT STATUS
+===========
+
+0 for success, 1 for failure.
+
+.. include:: manftr.rst
diff --git a/dasm2atasm.1 b/dasm2atasm.1
index 699f97d..733037c 100644
--- a/dasm2atasm.1
+++ b/dasm2atasm.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "DASM2ATASM" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "DASM2ATASM" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
dasm2atasm \- Convert 6502 assembly source from dasm syntax to atasm or ca65 syntax.
.\" RST source for dasm2atasm(1) man page. Convert with:
@@ -223,25 +223,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/diffbas b/diffbas
new file mode 100755
index 0000000..ef621e5
--- /dev/null
+++ b/diffbas
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+usage() {
+ cat <<EOF
+Usage: $( basename $0 ) [diff-opts] [-- listbas-opts] file1.bas file2.bas
+
+Diff two tokenized Atari BASIC programs, using listbas(1) and diff(1).
+
+[diff-opts] is passed through as-is to diff.
+[listbas-opts] is passed through as-is to listbas.
+EOF
+ exit "$1"
+}
+
+cleanup() {
+ if [ "$dir" != "" ]; then
+ cd
+ rm -rf "$dir"
+ fi
+}
+
+if [ "$1" = "-h" -o "$1" = "--help" -o "$1" = "" ]; then
+ usage 0
+fi
+
+for i in "$@"; do
+ if [ -f "$i" ]; then
+ if [ "$file1" = "" ]; then
+ file1="$( realpath $i )"
+ base1="$( basename $i )".lst
+ elif [ "$file2" = "" ]; then
+ file2="$( realpath $i )"
+ base2="$( basename $i )".lst
+ else
+ usage 1
+ fi
+ elif [ "$i" = "--" ]; then
+ opts="listbasopts"
+ elif [ "$opts" = "listbasopts" ]; then
+ listbasopts="$listbasopts $i"
+ else
+ diffopts="$diffopts $i"
+ fi
+done
+
+dir="$( mktemp -d -t diffbas.XXXXXXXXXX )"
+[ -d "$dir" ]
+cd "$dir"
+trap cleanup EXIT
+set -e
+
+listbas $listbasopts "$file1" > $base1
+listbas $listbasopts "$file2" > $base2
+diff $diffopts $base1 $base2
+
+exit 0
diff --git a/diffbas.1 b/diffbas.1
new file mode 100644
index 0000000..67a9f4f
--- /dev/null
+++ b/diffbas.1
@@ -0,0 +1,132 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "DIFFBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+diffbas \- Show differences between two tokenized Atari 8-bit BASIC files
+.SH SYNOPSIS
+.sp
+diffbas [\fIdiff\-options\fP] [\fB\-\-\fP \fIlistbas\-options\fP] \fIfile1\fP \fIfile2\fP
+.SH DESCRIPTION
+.sp
+\fBdiffbas\fP shows the differences between two tokenized (SAVEd)
+Atari BASIC programs, using \fBlistbas\fP(1) and \fBdiff\fP(1).
+.SH OPTIONS
+.sp
+\fBdiffbas\fP takes no options of its own. It will pass options as\-is
+to both \fBlistbas\fP and \fBdiff\fP\&. Use \fB\-\-\fP to separate them: everything
+before \fB\-\-\fP is passed to \fBdiff\fP, and everything between \fB\-\-\fP and
+the first filename is passed to \fBlistbas\fP\&.
+.SH COLOR
+.sp
+By default, the output is colorized by \fBlistbas\fP\&. If you want to use
+\fBdiff\fP\(aqs \fB\-\-color\fP option, you should use \fB\-n\fP as a \fBlistbas\fP
+option. Color diffs are most useful with \fB\-u\fP (unified diff format),
+so the command would look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+$ diffbas \-u \-\-color \-\- \-n A.BAS B.BAS
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH EXAMPLE
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+$ diffbas \-u A.BAS B.BAS
+
+\-\-\- A.BAS.lst 2024\-07\-12 23:56:46.937965855 \-0400
++++ B.BAS.lst 2024\-07\-12 23:56:46.938965854 \-0400
+@@ \-1,3 +1,4 @@
+ 10 ? "THIS LINE IS IN BOTH PROGRAMS."
+ 20 ? "THIS LINE IS ALSO IN BOTH."
++25 ? "THIS LINE ONLY IN B.BAS!"
+ 30 END
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH EXIT STATUS
+.sp
+0 for success. On failure, the exit status is that of whichever command
+failed (\fBlistbas\fP or \fBdiff\fP).
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/diffbas.rst b/diffbas.rst
new file mode 100644
index 0000000..0fd94c0
--- /dev/null
+++ b/diffbas.rst
@@ -0,0 +1,57 @@
+=======
+diffbas
+=======
+
+--------------------------------------------------------------
+Show differences between two tokenized Atari 8-bit BASIC files
+--------------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+diffbas [*diff-options*] [**--** *listbas-options*] *file1* *file2*
+
+DESCRIPTION
+===========
+**diffbas** shows the differences between two tokenized (SAVEd)
+Atari BASIC programs, using **listbas**\(1) and **diff**\(1).
+
+OPTIONS
+=======
+**diffbas** takes no options of its own. It will pass options as-is
+to both **listbas** and **diff**. Use **--** to separate them: everything
+before **--** is passed to **diff**, and everything between **--** and
+the first filename is passed to **listbas**.
+
+COLOR
+=====
+By default, the output is colorized by **listbas**. If you want to use
+**diff**\'s **--color** option, you should use **-n** as a **listbas**
+option. Color diffs are most useful with **-u** (unified diff format),
+so the command would look like::
+
+ $ diffbas -u --color -- -n A.BAS B.BAS
+
+EXAMPLE
+=======
+
+::
+
+ $ diffbas -u A.BAS B.BAS
+
+ --- A.BAS.lst 2024-07-12 23:56:46.937965855 -0400
+ +++ B.BAS.lst 2024-07-12 23:56:46.938965854 -0400
+ @@ -1,3 +1,4 @@
+ 10 ? "THIS LINE IS IN BOTH PROGRAMS."
+ 20 ? "THIS LINE IS ALSO IN BOTH."
+ +25 ? "THIS LINE ONLY IN B.BAS!"
+ 30 END
+
+EXIT STATUS
+===========
+0 for success. On failure, the exit status is that of whichever command
+failed (**listbas** or **diff**).
+
+.. include:: manftr.rst
diff --git a/dumpbas.1 b/dumpbas.1
new file mode 100644
index 0000000..44554e3
--- /dev/null
+++ b/dumpbas.1
@@ -0,0 +1,244 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "DUMPBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+dumpbas \- Formatted hexdump for tokenized Atari 8-bit BASIC files
+.SH SYNOPSIS
+.sp
+dumpbas [\fB\-v\fP] [\fB\-l\fP \fIlineno\fP] [\fB\-s\fP \fIstart\-lineno\fP] [\fB\-e\fP \fIend\-lineno\fP] \fIinput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBdumpbas\fP reads a tokenized Atari 8\-bit BASIC program and prints a
+formatted hexdump on standard output. The formatting groups the hex bytes
+by line and statement, and includes special characters to mark different
+types of token (see \fBFORMATTING\fP, below).
+.sp
+\fBdumpbas\fP does not detokenize BASIC programs or dump information
+about variable names/values. Use \fBchkbas\fP(1) for that. This tool is
+intended to help the user learn about the tokenized BASIC format, or
+as an aid for developing/debugging other tools that process tokenized
+files. It\(aqs an alternative to looking at raw hex dumps.
+.sp
+It\(aqs assumed the user has at least some knowledge of BASIC\(aqs tokenized
+SAVE format. The \fBAtari BASIC Sourcebook\fP is a good starting point
+for learning the tokenized format.
+.SH OPTIONS
+.SS Dump Options
+.INDENT 0.0
+.TP
+.B \fB\-s\fP \fIstart\-lineno\fP
+Don\(aqt dump lines before \fBstart\-lineno\fP\&. Default: \fI0\fP\&.
+.TP
+.B \fB\-e\fP \fIend\-lineno\fP
+Don\(aqt dump lines after \fBstart\-lineno\fP\&. Default: \fI32768\fP\&.
+.TP
+.B \fB\-l\fP \fIlineno\fP
+Only dump one line. This is exactly equivalent to "\fB\-s\fP \fIlineno\fP \fB\-e\fP \fIlineno\fP".
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH FORMATTING
+.sp
+Every byte in the file is displayed in hex. However, they are grouped by line
+and statement, and certain tokens get marker characters to help keep track
+of what they\(aqre for. Strings are displayed in quotes, in both hex and ASCII. Floating
+point constants are displayed as 6 hex bytes with square brackets around them.
+.SS Line Header Markers
+.INDENT 0.0
+.TP
+.B \fB@\fP
+Separates decimal line number from hex file offset.
+.TP
+.B \fB^\fP
+Prefix for line length.
+.TP
+.B \fB(\fP \fB)\fP
+Surrounds the 2 hex bytes for the line number.
+.UNINDENT
+.SS Statement Markers
+.INDENT 0.0
+.TP
+.B \fB>\fP
+Prefix for next\-statement offset. Every statement begins with this.
+.TP
+.B \fB!\fP
+Prefix for a command token. Every line of BASIC code begins with a
+command.
+.TP
+.B \fB:\fP
+Suffix for the \fI14\fP token; end of statement.
+.TP
+.B \fB#\fP
+Prefix for the \fI0e\fP token, which introduces a BCD floating point constant.
+.TP
+.B \fB[\fP \fB]\fP
+Surrounds the 6 bytes of a BCD floating point constant.
+.TP
+.B \fB$\fP
+Prefix for the \fI0f\fP token, which introduces a string constant.
+.TP
+.B \fB=\fP
+Prefix for the string\-length byte of a string constant.
+.UNINDENT
+.SS String Byte Markers
+.INDENT 0.0
+.TP
+.B \fB"\fP
+A string constant is surrounded by double\-quotes.
+.TP
+.B \fB^\fP
+Prefix for a control character. For instance, \fI03\fP is displayed as \fI^C\fP\&.
+.TP
+.B \fB|\fP
+Prefix for an inverse video character. Example: \fIc1\fP (inverse video \fIA\fP)
+is displayed as \fI|A\fP\&. May be combined with \fI^\fP, for inverse control characters.
+.TP
+.B \fB/\fP
+Separates the printable ASCII representation of a character from its hex byte.
+Example: \fIA/41\fP\&.
+.UNINDENT
+.SS Line header
+.sp
+Each line number begins with the line number (decimal) and offset from
+the start of the file (hex), followed by the 2 hex bytes for the line
+number in parentheses, followed by the line length (hex, preceded by
+^). Example:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10@0018 (0a 00): ^19
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The line number is \fI10\fP, and the file offset is \fI0018\fP\&. The \fI0a 00\fP
+are 10 again, in hex, LSB first. The \fI19\fP is the line length.
+.SS Statements
+.sp
+Each statement within the line is displayed separately. For this line of code:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 ? "HELLO":A=1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The dump looks like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10@0018 (0a 00): ^19
+ >0d !28 $0f =05 "H/48 E/45 L/4c L/4c O/4f" 14:
+ >19 !36 80 2d #0e [40 01 00 00 00 00] 16
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The first line is the line header. The next two are the two
+statements. The first one ends with token \fI14\fP (the end\-of\-statement
+or tokenized colon) and the second ends with \fI16\fP (the end\-of\-line
+token). The string \fI"HELLO"\fP is visible, and so is the floating point
+constant \fI1\fP\&.
+.sp
+Long statements will wrap, if they\(aqre wider than the terminal. If this
+is a problem, use a wider terminal, and/or pipe through a pager that
+knows how to scroll horizontally.
+.SH EXIT STATUS
+.sp
+0 for success, 1 for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/dumpbas.c b/dumpbas.c
new file mode 100644
index 0000000..087e5b1
--- /dev/null
+++ b/dumpbas.c
@@ -0,0 +1,310 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+
+int startlineno = 0;
+int endlineno = 32768;
+
+/* dump tokens for each line in a BASIC program. easier to read than
+ a plain hex dump. */
+void print_help(void) {
+ printf("Usage: %s [-v] [-s start-lineno] [-e end-lineno] <inputfile>\n", self);
+}
+
+unsigned short getlineno(char opt, const char *arg) {
+ int lineno;
+ char *e;
+
+ lineno = (int)strtol(arg, &e, 10);
+
+ if(*e) {
+ fprintf(stderr, "%s: Invalid line number for -%c option: %s is not a number.\n",
+ self, opt, arg);
+ exit(1);
+ }
+
+ if(lineno < 0 || lineno > 32767) {
+ fprintf(stderr, "%s: Invalid line number for -%c option: %d > 32767.\n",
+ self, opt, lineno);
+ exit(1);
+ }
+
+ return ((unsigned short)lineno);
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "vs:e:l:")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 's': startlineno = getlineno(opt, optarg); break;
+ case 'e': endlineno = getlineno(opt, optarg); break;
+ case 'l': startlineno = getlineno(opt, optarg);
+ endlineno = startlineno; break;
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(optind >= argc)
+ die("No input file given (use - for stdin).");
+ else
+ open_input(argv[optind]);
+}
+
+void print_atascii(unsigned char c) {
+ if(c & 0x80) {
+ putchar('|');
+ c &= 0x7f;
+ }
+
+ if(c < 32) {
+ putchar('^');
+ c += 0x40;
+ }
+
+ if(c == 0x7f)
+ printf("del");
+ else
+ putchar(c);
+ putchar('/');
+}
+
+/* REM, DATA, ERROR lines are terminated by $9B, a real EOL, not
+ the BASIC token. Since they're strings, print them in ASCII too. */
+/*
+int handle_text_stmt(int pos) {
+ unsigned char c;
+
+ do {
+ c = program[pos];
+ print_atascii(c);
+ printf("%02x ", c);
+ pos++;
+ } while(c != 0x9b);
+
+ return pos;
+}
+*/
+
+CALLBACK(handle_text) {
+ unsigned char c;
+
+ do {
+ c = program[pos];
+ print_atascii(c);
+ printf("%02x ", c);
+ pos++;
+ } while(c != 0x9b);
+}
+
+CALLBACK(handle_cmd) {
+ printf("!%02x ", tok);
+}
+
+/*
+int handle_cmd(int pos) {
+ unsigned char tok = program[pos];
+
+ printf("!%02x ", tok);
+ switch(tok) {
+ case CMD_REM:
+ case CMD_DATA:
+ case CMD_ERROR:
+ return handle_text_stmt(pos + 1);
+ default:
+ return pos + 1;
+ }
+}
+*/
+
+/*
+void handle_string(int pos) {
+ int i, len;
+ len = program[pos + 1];
+ printf("$%02x =%02x \"", program[pos], len);
+ for(i = pos; i < pos + len; i++) {
+ unsigned char c = program[i + 2];
+ print_atascii(c);
+ printf("%02x%c", c, (i == (pos + len - 1) ? '"' : ' '));
+ }
+ putchar(' ');
+}
+*/
+
+/*
+void handle_num(int pos) {
+ int i;
+ printf("#%02x [", program[pos]);
+ for(i = 0; i < 6; i++)
+ printf("%02x%c", program[pos + 1 + i], (i == 5 ? ']' : ' '));
+ putchar(' ');
+}
+*/
+
+CALLBACK(handle_op) {
+ switch(tok) {
+ case OP_EOS:
+ printf("%02x:", tok);
+ return;
+ case OP_NUMCONST:
+ putchar('#'); break;
+ case OP_STRCONST:
+ putchar('$'); break;
+ default: break;
+ }
+ printf("%02x ", tok);
+}
+
+CALLBACK(handle_var) {
+ printf("%02x", tok);
+ switch(get_vartype(tok)) {
+ case TYPE_ARRAY:
+ putchar('('); break;
+ case TYPE_STRING:
+ putchar('$'); break;
+ default: break;
+ }
+ putchar(' ');
+}
+
+CALLBACK(handle_string) {
+ int i, len;
+ len = program[pos];
+ printf("=%02x \"", len);
+ for(i = pos; i < pos + len; i++) {
+ unsigned char c = program[i + 1];
+ print_atascii(c);
+ printf("%02x%c", c, (i == (pos + len - 1) ? '"' : ' '));
+ }
+ putchar(' ');
+}
+
+CALLBACK(handle_num) {
+ int i;
+ putchar('[');
+ for(i = 0; i < 6; i++)
+ printf("%02x%c", program[pos + i], (i == 5 ? ']' : ' '));
+ putchar(' ');
+}
+
+CALLBACK(handle_start_line) {
+ printf("%5d @%04x (%02x %02x): ^%02x\n",
+ lineno, pos, program[pos], program[pos + 1], program[pos + 2]);
+}
+
+CALLBACK(handle_end_line) {
+ putchar('\n');
+}
+
+CALLBACK(handle_start_stmt) {
+ printf(" >%02x ", tok);
+}
+
+CALLBACK(handle_end_stmt) {
+ putchar('\n');
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+
+ on_start_line = handle_start_line;
+ on_end_line = handle_end_line;
+ on_start_stmt = handle_start_stmt;
+ on_end_stmt = handle_end_stmt;
+ on_exp_token = handle_op;
+ on_cmd_token = handle_cmd;
+ on_num_const = handle_num;
+ on_string_const = handle_string;
+ on_text = handle_text;
+ on_var_token = handle_var;
+
+ walk_code(startlineno, endlineno);
+
+ return 0;
+}
+
+/* sorry, this is horrid, more like assembly than C. */
+#if 0
+int main(int argc, char **argv) {
+ int linepos, nextpos, offset, soffset, lineno, pos, end, tok;
+
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+
+ linepos = codestart;
+ while(linepos < filelen) { /* loop over lines */
+ lineno = getword(linepos);
+ offset = program[linepos + 2];
+ nextpos = linepos + offset;
+
+ if(offset < 6)
+ die("Can't dump a protected program, unprotect it first.");
+
+ if(lineno < startlineno) {
+ linepos = nextpos;
+ continue;
+ }
+
+ /* line header */
+ printf("%5d@%04x (%02x %02x): ^%02x ",
+ lineno, linepos, program[linepos], program[linepos + 1], offset);
+
+ pos = linepos + 3;
+ while(pos < nextpos) { /* loop over statements within a line */
+ soffset = program[pos];
+ end = linepos + soffset;
+
+ while(pos < end) { /* loop over tokens within a statement */
+ printf("\n >%02x ", program[pos++]); /* offset */
+ pos = handle_cmd(pos++); /* 1st token is the command */
+
+ while(pos < end) { /* loop over operators */
+ tok = program[pos];
+ switch(tok) {
+ case OP_NUMCONST:
+ handle_num(pos);
+ pos += 7;
+ break;
+ case OP_STRCONST:
+ handle_string(pos);
+ pos += program[pos + 1] + 2;
+ break;
+ default:
+ printf("%02x", program[pos]);
+ if(pos == (end - 1) && tok == OP_EOS)
+ putchar(':');
+ else
+ putchar(' ');
+ pos++;
+ break;
+ }
+ }
+ }
+ }
+
+ putchar('\n');
+
+ if(lineno == endlineno) break;
+ linepos = nextpos;
+ }
+
+ return 0;
+}
+#endif
diff --git a/dumpbas.rst b/dumpbas.rst
new file mode 100644
index 0000000..6dc32b9
--- /dev/null
+++ b/dumpbas.rst
@@ -0,0 +1,145 @@
+=======
+dumpbas
+=======
+
+-------------------------------------------------------
+Formatted hexdump for tokenized Atari 8-bit BASIC files
+-------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+dumpbas [**-v**] [**-l** *lineno*] [**-s** *start-lineno*] [**-e** *end-lineno*] *input-file*
+
+DESCRIPTION
+===========
+**dumpbas** reads a tokenized Atari 8-bit BASIC program and prints a
+formatted hexdump on standard output. The formatting groups the hex bytes
+by line and statement, and includes special characters to mark different
+types of token (see **FORMATTING**, below).
+
+**dumpbas** does not detokenize BASIC programs or dump information
+about variable names/values. Use **chkbas**\(1) for that. This tool is
+intended to help the user learn about the tokenized BASIC format, or
+as an aid for developing/debugging other tools that process tokenized
+files. It's an alternative to looking at raw hex dumps.
+
+It's assumed the user has at least some knowledge of BASIC's tokenized
+SAVE format. The **Atari BASIC Sourcebook** is a good starting point
+for learning the tokenized format.
+
+OPTIONS
+=======
+
+Dump Options
+------------
+**-s** *start-lineno*
+ Don't dump lines before **start-lineno**. Default: *0*.
+
+**-e** *end-lineno*
+ Don't dump lines after **start-lineno**. Default: *32768*.
+
+**-l** *lineno*
+ Only dump one line. This is exactly equivalent to "**-s** *lineno* **-e** *lineno*".
+
+.. include:: genopts.rst
+
+FORMATTING
+==========
+Every byte in the file is displayed in hex. However, they are grouped by line
+and statement, and certain tokens get marker characters to help keep track
+of what they're for. Strings are displayed in quotes, in both hex and ASCII. Floating
+point constants are displayed as 6 hex bytes with square brackets around them.
+
+Line Header Markers
+-------------------
+**@**
+ Separates decimal line number from hex file offset.
+
+**^**
+ Prefix for line length.
+
+**(** **)**
+ Surrounds the 2 hex bytes for the line number.
+
+Statement Markers
+-----------------
+**>**
+ Prefix for next-statement offset. Every statement begins with this.
+
+**!**
+ Prefix for a command token. Every line of BASIC code begins with a
+ command.
+
+**:**
+ Suffix for the *14* token; end of statement.
+
+**#**
+ Prefix for the *0e* token, which introduces a BCD floating point constant.
+
+**[** **]**
+ Surrounds the 6 bytes of a BCD floating point constant.
+
+**$**
+ Prefix for the *0f* token, which introduces a string constant.
+
+**=**
+ Prefix for the string-length byte of a string constant.
+
+String Byte Markers
+-------------------
+**"**
+ A string constant is surrounded by double-quotes.
+
+**^**
+ Prefix for a control character. For instance, *03* is displayed as *^C*.
+
+**|**
+ Prefix for an inverse video character. Example: *c1* (inverse video *A*)
+ is displayed as *|A*. May be combined with *^*, for inverse control characters.
+
+**/**
+ Separates the printable ASCII representation of a character from its hex byte.
+ Example: *A/41*.
+
+Line header
+-----------
+Each line number begins with the line number (decimal) and offset from
+the start of the file (hex), followed by the 2 hex bytes for the line
+number in parentheses, followed by the line length (hex, preceded by
+^). Example::
+
+ 10@0018 (0a 00): ^19
+
+The line number is *10*, and the file offset is *0018*. The *0a 00*
+are 10 again, in hex, LSB first. The *19* is the line length.
+
+Statements
+----------
+Each statement within the line is displayed separately. For this line of code::
+
+ 10 ? "HELLO":A=1
+
+The dump looks like::
+
+ 10@0018 (0a 00): ^19
+ >0d !28 $0f =05 "H/48 E/45 L/4c L/4c O/4f" 14:
+ >19 !36 80 2d #0e [40 01 00 00 00 00] 16
+
+The first line is the line header. The next two are the two
+statements. The first one ends with token *14* (the end-of-statement
+or tokenized colon) and the second ends with *16* (the end-of-line
+token). The string *"HELLO"* is visible, and so is the floating point
+constant *1*.
+
+Long statements will wrap, if they're wider than the terminal. If this
+is a problem, use a wider terminal, and/or pipe through a pager that
+knows how to scroll horizontally.
+
+EXIT STATUS
+===========
+
+0 for success, 1 for failure.
+
+.. include:: manftr.rst
diff --git a/fauxtari.7 b/fauxtari.7
new file mode 100644
index 0000000..3300496
--- /dev/null
+++ b/fauxtari.7
@@ -0,0 +1,346 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "FAUXTARI" 7 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+fauxtari \- Atari 8-bit-based font for Linux console and X11/Wayland/Mac/Windows
+.SH DESCRIPTION
+.sp
+\fBfauxtari\fP is a set of monospaced bitmap fonts for use with the
+Linux console or graphical environments such as X11. Most of the
+glyphs are taken from the Atari XL/XE ROM font; see \fBGLYPHS\fP, below.
+.sp
+Three font formats are provided: \fBpsf\fP, for use with the console;
+\fBbdf\fP, for use with "old\-school" X11 apps such as \fBxterm\fP(1);
+and \fBttf\fP for use with modern X11/Wayland/Mac/Windows apps.
+.SH APPEARANCE
+.sp
+The console (\fBpsf\fP files) and X11 (\fBbdf\fP files) fonts each come
+in 3 sizes: 8x8 (original size), 16x16 (scaled 2x), and 24x24 (scaled
+3x). The scaling has no interpolation or antialiasing, so the larger
+fonts have a blocky "retro" look.
+.sp
+The appearance of the font is also vertically squashed, since it was
+designed for non\-square pixels (NTSC and PAL "pixels" are slightly
+taller than they are wide). This allows you to fit a \fIlot\fP of text
+on the screen, in the console or with a fullscreen X terminal:
+.TS
+center;
+|l|l|l|.
+_
+T{
+Font Size
+T} T{
+Display Size
+T} T{
+Characters
+T}
+_
+T{
+8x8
+T} T{
+1280x1024
+T} T{
+160x128
+T}
+_
+T{
+8x8
+T} T{
+1920x1080
+T} T{
+240x135
+T}
+_
+T{
+8x8
+T} T{
+3840x2160
+T} T{
+480x270
+T}
+_
+T{
+16x16
+T} T{
+1280x1024
+T} T{
+80x64
+T}
+_
+T{
+16x16
+T} T{
+1920x1080
+T} T{
+120x67
+T}
+_
+T{
+16x16
+T} T{
+3840x2160
+T} T{
+240x135
+T}
+_
+T{
+24x24
+T} T{
+1280x1024
+T} T{
+53x42
+T}
+_
+T{
+24x24
+T} T{
+1920x1080
+T} T{
+80x45
+T}
+_
+T{
+24x24
+T} T{
+3840x2160
+T} T{
+160x90
+T}
+_
+.TE
+.sp
+Of course, the smaller font sizes might be too small to read, especially
+on smaller displays.
+.sp
+The TrueType font is scalable, but always retains the pixelated look.
+.SH CONSOLE
+.sp
+If the \fBpsf\fP fonts have been installed to the standard console font
+directory (usually \fB/usr/share/kbd/consolefonts/\fP; this is done by
+\fBmake install\fP when \fBbw\-atari8\-tools\fP is built), you can use e.g.:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+setfont fauxtari\-16
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Replace the 16 with 8 or 24, for the other sizes. For Slackware Linux,
+you can make this the default in \fB/etc/rc.d/rc.font\fP, or just put it
+in \fB/etc/rc.d/rc.local\fP\&. Other Linux distributions will have their
+own ways to set this up (especially systemd\-based ones).
+.SH X11/ETC
+.SS TTF (scalable)
+.sp
+The scalable font is called \fBFauxtari Scalable Mono\fP, and should be
+selectable from graphical applications that allow choosing the font.
+You may also see \fBFauxtari Fixed Mono\fP in the list; this is the \fBbdf\fP
+font.
+.sp
+It can also be used in \fBurxvt\fP and \fBxterm\fP (provided \fBxterm\fP
+was built with support for TTF fonts):
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+urxvt \-fn \(aqxft:Fauxtari Scalable Mono:pixelsize=16\(aq
+
+xterm \-fa \(aqFauxtari Scalable Mono\(aq \-fs 16
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The font can be scaled to any size, though it will look best if you
+stick with multiples of 8 pixels.
+.sp
+The scalable font should also work on Wayland, Macintosh, or Windows
+systems, though this hasn\(aqt been tested.
+.SS BDF (non\-scalable)
+.sp
+If the \fBbdf\fP fonts have been installed (via \fBmake install\fP when
+\fBbw\-atari8\-tools\fP is built), you should be able to launch a terminal
+via:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+xterm \-fn fauxtari\-16
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Replace the 16 with 8 or 24, for the other sizes. These names are
+aliases (added to \fBfonts.alias\fP in the font directory); the full
+names are:
+.INDENT 0.0
+.IP \(bu 2
+\-bw\-fauxtari fixed mono\-medium\-r\-normal\-\-8\-80\-75\-75\-c\-80\-iso10646\-1
+.IP \(bu 2
+\-bw\-fauxtari fixed mono\-medium\-r\-normal\-\-16\-160\-75\-75\-c\-160\-iso10646\-1
+.IP \(bu 2
+\-bw\-fauxtari fixed mono\-medium\-r\-normal\-\-24\-240\-75\-75\-c\-240\-iso10646\-1
+.UNINDENT
+.sp
+For \fBurxvt\fP(1), you might have to turn off the \fBboldFont\fP resource (set
+it to an empty string), or run it as:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+urxvt \-fn fauxtari\-16 \-fb ""
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+This keeps \fBurxvt\fP from using some other font (from its built\-in
+list, or from your \fBURxvt.font\fP resource) for bold characters.
+.sp
+For \fBst\fP from suckless.org, run:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+st \-f fauxtari\-16
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+It\(aqs possible to use the fonts with \fBrxvt\fP, but since \fBrxvt\fP
+doesn\(aqt support Unicode, it won\(aqt be all that useful except for plain
+ASCII text. Why are you still using \fBrxvt\fP, anyway?
+.SH GLYPHS
+.sp
+All 3 sizes contain the same set of glyphs. These include:
+.INDENT 0.0
+.IP \(bu 2
+Printable ASCII. Complete. Mostly taken from the Atari 800XL ROM
+($E000 area), except the \fB~\fP \fB{\fP \fB}\fP \fB\(ga\fP characters which are
+missing from the Atari\(aqs character set (these were hand\-drawn by the
+author).
+.IP \(bu 2
+Unicode mappings for ATASCII graphics characters. Complete set. These
+work well with \fBlistbas\fP(1), \fBa8cat\fP(1), and \fBa8xd\fP(1). The glyphs
+are taken from the 800XL ROM.
+.IP \(bu 2
+The XL International Character set (umlauted/accented letters, plus
+the \fB¡\fP character and the British pound sign), taken from the 800XL ROM
+($CC00 area).
+.IP \(bu 2
+Arabic, taken from Atari\(aqs Arabic model of the 65XE. Only the
+isolated and terminal letter forms are included, but these are
+also mapped to the Unicode codepoints for the initial and medial forms.
+Hopefully this results in readable Arabic text. The creator of
+\fBfauxtari\fP can\(aqt read Arabic at all and doesn\(aqt know anyone who
+can, so some of the character mappings may be wrong.
+.IP \(bu 2
+Hebrew glyphs, the complete aleph\-bet, taken from the Hebrew ROM
+modification that was available for sale in Israel in the early 1980s.
+I\(aqm almost 100% certain this was a 3rd\-party product, not made by Atari.
+.IP \(bu 2
+Polish accented letters, taken from a Polish XL ROM found on the Web
+at some point. No idea who created this or whether it was homebrew or
+commercial.
+.IP \(bu 2
+A few extra Latin\-1 characters, hand\-drawn by the author. These include
+Spanish punctuation (quotation marks, inverted question mark), the
+copyright symbol, and the Euro currency sign.
+.IP \(bu 2
+TODO: Commodore 64 graphics characters.
+.UNINDENT
+.SH LIMITATIONS
+.INDENT 0.0
+.IP \(bu 2
+There should be more glyphs; at least Unicode Latin\-1 should have complete
+coverage. Some of them (e.g. fractions) will be hard to do in 8x8 character
+cells...
+.IP \(bu 2
+There are no true descenders, since the Atari ROM character set doesn\(aqt use them.
+Someday I may add hand\-hacked true descender versions of the fonts.
+.UNINDENT
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/fauxtari.rst b/fauxtari.rst
new file mode 100644
index 0000000..736a9c4
--- /dev/null
+++ b/fauxtari.rst
@@ -0,0 +1,175 @@
+========
+fauxtari
+========
+
+--------------------------------------------------------------------
+Atari 8-bit-based font for Linux console and X11/Wayland/Mac/Windows
+--------------------------------------------------------------------
+
+.. include:: manhdr7.rst
+
+DESCRIPTION
+===========
+
+**fauxtari** is a set of monospaced bitmap fonts for use with the
+Linux console or graphical environments such as X11. Most of the
+glyphs are taken from the Atari XL/XE ROM font; see **GLYPHS**, below.
+
+Three font formats are provided: **psf**, for use with the console;
+**bdf**, for use with "old-school" X11 apps such as **xterm**\(1);
+and **ttf** for use with modern X11/Wayland/Mac/Windows apps.
+
+APPEARANCE
+==========
+
+The console (**psf** files) and X11 (**bdf** files) fonts each come
+in 3 sizes: 8x8 (original size), 16x16 (scaled 2x), and 24x24 (scaled
+3x). The scaling has no interpolation or antialiasing, so the larger
+fonts have a blocky "retro" look.
+
+The appearance of the font is also vertically squashed, since it was
+designed for non-square pixels (NTSC and PAL "pixels" are slightly
+taller than they are wide). This allows you to fit a *lot* of text
+on the screen, in the console or with a fullscreen X terminal:
+
+.. csv-table::
+
+ "Font Size", "Display Size", "Characters"
+ "8x8", "1280x1024", "160x128"
+ "8x8", "1920x1080", "240x135"
+ "8x8", "3840x2160", "480x270"
+ "16x16", "1280x1024", "80x64"
+ "16x16", "1920x1080", "120x67"
+ "16x16", "3840x2160", "240x135"
+ "24x24", "1280x1024", "53x42"
+ "24x24", "1920x1080", "80x45"
+ "24x24", "3840x2160", "160x90"
+
+Of course, the smaller font sizes might be too small to read, especially
+on smaller displays.
+
+The TrueType font is scalable, but always retains the pixelated look.
+
+CONSOLE
+=======
+
+If the **psf** fonts have been installed to the standard console font
+directory (usually **/usr/share/kbd/consolefonts/**; this is done by
+**make install** when **bw-atari8-tools** is built), you can use e.g.::
+
+ setfont fauxtari-16
+
+Replace the 16 with 8 or 24, for the other sizes. For Slackware Linux,
+you can make this the default in **/etc/rc.d/rc.font**, or just put it
+in **/etc/rc.d/rc.local**. Other Linux distributions will have their
+own ways to set this up (especially systemd-based ones).
+
+X11/etc
+=======
+
+TTF (scalable)
+--------------
+
+The scalable font is called **Fauxtari Scalable Mono**, and should be
+selectable from graphical applications that allow choosing the font.
+You may also see **Fauxtari Fixed Mono** in the list; this is the **bdf**
+font.
+
+It can also be used in **urxvt** and **xterm** (provided **xterm**
+was built with support for TTF fonts)::
+
+ urxvt -fn 'xft:Fauxtari Scalable Mono:pixelsize=16'
+
+ xterm -fa 'Fauxtari Scalable Mono' -fs 16
+
+The font can be scaled to any size, though it will look best if you
+stick with multiples of 8 pixels.
+
+The scalable font should also work on Wayland, Macintosh, or Windows
+systems, though this hasn't been tested.
+
+BDF (non-scalable)
+------------------
+
+If the **bdf** fonts have been installed (via **make install** when
+**bw-atari8-tools** is built), you should be able to launch a terminal
+via::
+
+ xterm -fn fauxtari-16
+
+Replace the 16 with 8 or 24, for the other sizes. These names are
+aliases (added to **fonts.alias** in the font directory); the full
+names are:
+
+- -bw-fauxtari fixed mono-medium-r-normal--8-80-75-75-c-80-iso10646-1
+
+- -bw-fauxtari fixed mono-medium-r-normal--16-160-75-75-c-160-iso10646-1
+
+- -bw-fauxtari fixed mono-medium-r-normal--24-240-75-75-c-240-iso10646-1
+
+For **urxvt**\(1), you might have to turn off the **boldFont** resource (set
+it to an empty string), or run it as::
+
+ urxvt -fn fauxtari-16 -fb ""
+
+This keeps **urxvt** from using some other font (from its built-in
+list, or from your **URxvt.font** resource) for bold characters.
+
+For **st** from suckless.org, run::
+
+ st -f fauxtari-16
+
+It's possible to use the fonts with **rxvt**, but since **rxvt**
+doesn't support Unicode, it won't be all that useful except for plain
+ASCII text. Why are you still using **rxvt**, anyway?
+
+GLYPHS
+======
+
+All 3 sizes contain the same set of glyphs. These include:
+
+- Printable ASCII. Complete. Mostly taken from the Atari 800XL ROM
+ ($E000 area), except the **~** **{** **}** **`** characters which are
+ missing from the Atari's character set (these were hand-drawn by the
+ author).
+
+- Unicode mappings for ATASCII graphics characters. Complete set. These
+ work well with **listbas**\(1), **a8cat**\(1), and **a8xd**\(1). The glyphs
+ are taken from the 800XL ROM.
+
+- The XL International Character set (umlauted/accented letters, plus
+ the **¡** character and the British pound sign), taken from the 800XL ROM
+ ($CC00 area).
+
+- Arabic, taken from Atari's Arabic model of the 65XE. Only the
+ isolated and terminal letter forms are included, but these are
+ also mapped to the Unicode codepoints for the initial and medial forms.
+ Hopefully this results in readable Arabic text. The creator of
+ **fauxtari** can't read Arabic at all and doesn't know anyone who
+ can, so some of the character mappings may be wrong.
+
+- Hebrew glyphs, the complete aleph-bet, taken from the Hebrew ROM
+ modification that was available for sale in Israel in the early 1980s.
+ I'm almost 100% certain this was a 3rd-party product, not made by Atari.
+
+- Polish accented letters, taken from a Polish XL ROM found on the Web
+ at some point. No idea who created this or whether it was homebrew or
+ commercial.
+
+- A few extra Latin-1 characters, hand-drawn by the author. These include
+ Spanish punctuation (quotation marks, inverted question mark), the
+ copyright symbol, and the Euro currency sign.
+
+- TODO: Commodore 64 graphics characters.
+
+LIMITATIONS
+===========
+
+- There should be more glyphs; at least Unicode Latin-1 should have complete
+ coverage. Some of them (e.g. fractions) will be hard to do in 8x8 character
+ cells...
+
+- There are no true descenders, since the Atari ROM character set doesn't use them.
+ Someday I may add hand-hacked true descender versions of the fonts.
+
+.. include:: manftr.rst
diff --git a/fenders.1 b/fenders.1
index ba1d7d4..7e4700f 100644
--- a/fenders.1
+++ b/fenders.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "FENDERS" 1 "2024-05-09" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "FENDERS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
fenders \- Install Fenders 3-sector loader in boot sectors of an ATR image
.\" RST source for fenders(1) man page. Convert with:
@@ -270,25 +270,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/fendersdbl.dasm b/fendersdbl.dasm
index cb6ea3f..23ebec7 100644
--- a/fendersdbl.dasm
+++ b/fendersdbl.dasm
@@ -287,18 +287,13 @@ clear_zp:
INY
BPL clear_zp
-; the "JSR try_read" below MUST be located at $087f.
-; The JSR opcode is the last byte loaded in the 3-sector boot loader,
-; and its operand is the first 2 bytes loaded from sector 720!
- .if *<>$087f
- .echo "Code offsets have changed, fix me (", *, "should be $087f)"
- .err
- .endif
JSR try_read ; cut here!
DEX
read_segment:
+ ; The JSR opcode below is the last byte in sector 3.
+ ; Its operand is the first 2 bytes in sector 720.
JSR get_next_byte
STA dest_ptr
JSR get_next_byte
diff --git a/fonts/FauxtariScalableMono.ttf b/fonts/FauxtariScalableMono.ttf
new file mode 100644
index 0000000..590bc3b
--- /dev/null
+++ b/fonts/FauxtariScalableMono.ttf
Binary files differ
diff --git a/fonts/Makefile b/fonts/Makefile
new file mode 100644
index 0000000..cb1c69f
--- /dev/null
+++ b/fonts/Makefile
@@ -0,0 +1,2 @@
+all:
+ cd .. && $(MAKE)
diff --git a/fonts/char0.raw b/fonts/char0.raw
new file mode 100644
index 0000000..a699b13
--- /dev/null
+++ b/fonts/char0.raw
Binary files differ
diff --git a/fonts/dupglyphs.pl b/fonts/dupglyphs.pl
new file mode 100644
index 0000000..0532522
--- /dev/null
+++ b/fonts/dupglyphs.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+# read a psftools .txt font, for any glyph that has multiple Unicode
+# codepoints, output that glyph multiple times (one per codepoint).
+# result is suitable for conversion to a BDF.
+
+$glyphcount = 0;
+
+sub dup {
+ my $orig = shift;
+ my $new;
+ my $ret;
+ my @cps = ($orig =~ /\[(\w+)\];/g);
+
+ for my $cp (@cps) {
+ #warn ">> $cp <<\n";
+ $glyphcount++;
+ ($new = $orig) =~ s,(Unicode: ).*,$1\[$cp\];,;
+ $ret .= $new;
+ }
+ return $ret;
+}
+
+$/ = '%';
+
+<>;
+$header = '%' . <>;
+
+$zerocount = 0;
+while(<>) {
+ next if /\[0000\];/ && ($zerocount++);
+ if(/Unicode:.*;.*;/) {
+ $_ = dup($_);
+ } else {
+ $glyphcount++;
+ }
+ $output .= $_;
+}
+
+$header =~ s/(Length:\s+)\d+/$1$glyphcount/;
+
+print $header . $output;
diff --git a/fonts/fauxtari-16.bdf b/fonts/fauxtari-16.bdf
new file mode 100644
index 0000000..8a219f0
--- /dev/null
+++ b/fonts/fauxtari-16.bdf
@@ -0,0 +1,9893 @@
+STARTFONT 2.1
+FONT -BW-Fauxtari Fixed Mono-Medium-R-Normal--16-160-75-75-C-160-iso10646-1
+SIZE 16 75 75
+FONTBOUNDINGBOX 16 16 0 -4
+STARTPROPERTIES 18
+FOUNDRY "BW"
+FAMILY_NAME "Fauxtari Fixed Mono"
+FACE_NAME "Fauxtari 16"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 16
+POINT_SIZE 160
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 160
+CHARSET_REGISTRY "iso10646"
+CHARSET_ENCODING "1"
+FONT_DESCENT 4
+FONT_ASCENT 12
+DEFAULT_CHAR 0
+ENDPROPERTIES
+CHARS 429
+STARTCHAR C0000
+ENCODING 0
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3cfc
+3cfc
+3000
+3000
+000c
+000c
+3000
+3000
+000c
+000c
+3f3c
+3f3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0001
+ENCODING 32
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0002
+ENCODING 33
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0003
+ENCODING 34
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0004
+ENCODING 35
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+ffff
+ffff
+3c3c
+3c3c
+3c3c
+3c3c
+ffff
+ffff
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0005
+ENCODING 36
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0ffc
+0ffc
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+3ff0
+3ff0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0006
+ENCODING 37
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3cf0
+3cf0
+03c0
+03c0
+0f00
+0f00
+3c3c
+3c3c
+303c
+303c
+0000
+0000
+ENDCHAR
+STARTCHAR C0007
+ENCODING 38
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03f0
+03f0
+0f3c
+0f3c
+03f0
+03f0
+0fc0
+0fc0
+3cff
+3cff
+3c3c
+3c3c
+0fcf
+0fcf
+0000
+0000
+ENDCHAR
+STARTCHAR C0008
+ENCODING 39
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0009
+ENCODING 40
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03f0
+03f0
+03c0
+03c0
+03c0
+03c0
+03f0
+03f0
+00fc
+00fc
+0000
+0000
+ENDCHAR
+STARTCHAR C000a
+ENCODING 41
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3f00
+3f00
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0fc0
+0fc0
+3f00
+3f00
+0000
+0000
+ENDCHAR
+STARTCHAR C000b
+ENCODING 42
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+0ff0
+0ff0
+ffff
+ffff
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C000c
+ENCODING 43
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C000d
+ENCODING 44
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0f00
+0f00
+ENDCHAR
+STARTCHAR C000e
+ENCODING 45
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C000f
+ENCODING 46
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0010
+ENCODING 47
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3c00
+3c00
+3000
+3000
+0000
+0000
+ENDCHAR
+STARTCHAR C0011
+ENCODING 48
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3cfc
+3cfc
+3f3c
+3f3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0012
+ENCODING 49
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0013
+ENCODING 50
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0014
+ENCODING 51
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+00f0
+00f0
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0015
+ENCODING 52
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00f0
+00f0
+03f0
+03f0
+0ff0
+0ff0
+3cf0
+3cf0
+3ffc
+3ffc
+00f0
+00f0
+0000
+0000
+ENDCHAR
+STARTCHAR C0016
+ENCODING 53
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+003c
+003c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0017
+ENCODING 54
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c00
+3c00
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0018
+ENCODING 55
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+003c
+003c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+0f00
+0f00
+0000
+0000
+ENDCHAR
+STARTCHAR C0019
+ENCODING 56
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C001a
+ENCODING 57
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+0ffc
+0ffc
+003c
+003c
+00f0
+00f0
+0fc0
+0fc0
+0000
+0000
+ENDCHAR
+STARTCHAR C001b
+ENCODING 58
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C001c
+ENCODING 59
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0f00
+0f00
+ENDCHAR
+STARTCHAR C001d
+ENCODING 60
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+003c
+003c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+03c0
+03c0
+00f0
+00f0
+003c
+003c
+0000
+0000
+ENDCHAR
+STARTCHAR C001e
+ENCODING 61
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C001f
+ENCODING 62
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+0f00
+0f00
+03c0
+03c0
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C0020
+ENCODING 63
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0021
+ENCODING 64
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3cfc
+3cfc
+3cfc
+3cfc
+3c00
+3c00
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0022
+ENCODING 65
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0023
+ENCODING 66
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0024
+ENCODING 67
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c00
+3c00
+3c00
+3c00
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0025
+ENCODING 68
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+3cf0
+3cf0
+3c3c
+3c3c
+3c3c
+3c3c
+3cf0
+3cf0
+3fc0
+3fc0
+0000
+0000
+ENDCHAR
+STARTCHAR C0026
+ENCODING 69
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+3c00
+3c00
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0027
+ENCODING 70
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C0028
+ENCODING 71
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ffc
+0ffc
+3c00
+3c00
+3c00
+3c00
+3cfc
+3cfc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0029
+ENCODING 72
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C002a
+ENCODING 73
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C002b
+ENCODING 74
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C002c
+ENCODING 75
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3cf0
+3cf0
+3fc0
+3fc0
+3fc0
+3fc0
+3cf0
+3cf0
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C002d
+ENCODING 76
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C002e
+ENCODING 77
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c0f
+3c0f
+3f3f
+3f3f
+3fff
+3fff
+3ccf
+3ccf
+3c0f
+3c0f
+3c0f
+3c0f
+0000
+0000
+ENDCHAR
+STARTCHAR C002f
+ENCODING 78
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3f3c
+3f3c
+3ffc
+3ffc
+3ffc
+3ffc
+3cfc
+3cfc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0030
+ENCODING 79
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0031
+ENCODING 80
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ff0
+3ff0
+3c00
+3c00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C0032
+ENCODING 81
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3cf0
+3cf0
+0f3c
+0f3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0033
+ENCODING 82
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ff0
+3ff0
+3cf0
+3cf0
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0034
+ENCODING 83
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+003c
+003c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0035
+ENCODING 84
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0036
+ENCODING 85
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0037
+ENCODING 86
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0038
+ENCODING 87
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c0f
+3c0f
+3c0f
+3c0f
+3ccf
+3ccf
+3fff
+3fff
+3f3f
+3f3f
+3c0f
+3c0f
+0000
+0000
+ENDCHAR
+STARTCHAR C0039
+ENCODING 88
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C003a
+ENCODING 89
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C003b
+ENCODING 90
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C003c
+ENCODING 91
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03fc
+03fc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C003d
+ENCODING 92
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3000
+3000
+3c00
+3c00
+0f00
+0f00
+03c0
+03c0
+00f0
+00f0
+003c
+003c
+0000
+0000
+ENDCHAR
+STARTCHAR C003e
+ENCODING 93
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3fc0
+3fc0
+0000
+0000
+ENDCHAR
+STARTCHAR C003f
+ENCODING 94
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00c0
+00c0
+03f0
+03f0
+0f3c
+0f3c
+3c0f
+3c0f
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0040
+ENCODING 95
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ffff
+ffff
+0000
+0000
+ENDCHAR
+STARTCHAR C0041
+ENCODING 96
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0042
+ENCODING 97
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0043
+ENCODING 98
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3c00
+3c00
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0044
+ENCODING 99
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0045
+ENCODING 100
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0046
+ENCODING 101
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0047
+ENCODING 102
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03c0
+03c0
+0ffc
+0ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0048
+ENCODING 103
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ffc
+0ffc
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0049
+ENCODING 104
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3c00
+3c00
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C004a
+ENCODING 105
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C004b
+ENCODING 106
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+0000
+0000
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C004c
+ENCODING 107
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3c00
+3c00
+3cf0
+3cf0
+3fc0
+3fc0
+3cf0
+3cf0
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C004d
+ENCODING 108
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C004e
+ENCODING 109
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+3fff
+3fff
+3fff
+3fff
+3ccf
+3ccf
+3c0f
+3c0f
+0000
+0000
+ENDCHAR
+STARTCHAR C004f
+ENCODING 110
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0050
+ENCODING 111
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0051
+ENCODING 112
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ff0
+3ff0
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0052
+ENCODING 113
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ffc
+0ffc
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+003c
+003c
+003c
+003c
+ENDCHAR
+STARTCHAR C0053
+ENCODING 114
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C0054
+ENCODING 115
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ffc
+0ffc
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0055
+ENCODING 116
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+00fc
+00fc
+0000
+0000
+ENDCHAR
+STARTCHAR C0056
+ENCODING 117
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0057
+ENCODING 118
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0058
+ENCODING 119
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c0f
+3c0f
+3ccf
+3ccf
+3fff
+3fff
+0ffc
+0ffc
+0f3c
+0f3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0059
+ENCODING 120
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C005a
+ENCODING 121
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+00f0
+00f0
+3fc0
+3fc0
+ENDCHAR
+STARTCHAR C005b
+ENCODING 122
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C005c
+ENCODING 123
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+03c0
+03c0
+0f00
+0f00
+03c0
+03c0
+03c0
+03c0
+00f0
+00f0
+0000
+0000
+ENDCHAR
+STARTCHAR C005d
+ENCODING 124
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C005e
+ENCODING 125
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+03c0
+03c0
+00f0
+00f0
+03c0
+03c0
+03c0
+03c0
+0f00
+0f00
+0000
+0000
+ENDCHAR
+STARTCHAR C005f
+ENCODING 126
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3f0f
+3f0f
+f3cf
+f3cf
+f0fc
+f0fc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0060
+ENCODING 160
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0061
+ENCODING 161
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0062
+ENCODING 162
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ffc
+0ffc
+3c00
+3c00
+3c00
+3c00
+0ffc
+0ffc
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0063
+ENCODING 163
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03f0
+03f0
+0f00
+0f00
+0f00
+0f00
+3fc0
+3fc0
+0f00
+0f00
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0064
+ENCODING 164
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+300c
+300c
+0ff0
+0ff0
+0c30
+0c30
+0c30
+0c30
+0ff0
+0ff0
+300c
+300c
+0000
+0000
+ENDCHAR
+STARTCHAR C0065
+ENCODING 165
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+3c3c
+3c3c
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0066
+ENCODING 166
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0067
+ENCODING 167
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03f0
+03f0
+0c00
+0c00
+03c0
+03c0
+0c30
+0c30
+03c0
+03c0
+0030
+0030
+0fc0
+0fc0
+0000
+0000
+ENDCHAR
+STARTCHAR C0068
+ENCODING 168
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0069
+ENCODING 169
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3ff0
+3ff0
+c00c
+c00c
+c3cc
+c3cc
+cc0c
+cc0c
+c3cc
+c3cc
+c00c
+c00c
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C006a
+ENCODING 170
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+00fc
+00fc
+0f3c
+0f3c
+03fc
+03fc
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C006b
+ENCODING 171
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+f0f0
+f0f0
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C006c
+ENCODING 172
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+003c
+003c
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C006d
+ENCODING 173
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C006e
+ENCODING 174
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3ff0
+3ff0
+c00c
+c00c
+cf0c
+cf0c
+cccc
+cccc
+cf0c
+cf0c
+cccc
+cccc
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C006f
+ENCODING 175
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0070
+ENCODING 176
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0c30
+0c30
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0071
+ENCODING 177
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0072
+ENCODING 178
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+30c0
+30c0
+0300
+0300
+0c00
+0c00
+3fc0
+3fc0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0073
+ENCODING 179
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+30c0
+30c0
+0300
+0300
+30c0
+30c0
+0f00
+0f00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0074
+ENCODING 180
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0075
+ENCODING 181
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+003c
+003c
+0000
+0000
+ENDCHAR
+STARTCHAR C0076
+ENCODING 182
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+3f3c
+3f3c
+3f3c
+3f3c
+0f3c
+0f3c
+033c
+033c
+033c
+033c
+0000
+0000
+ENDCHAR
+STARTCHAR C0077
+ENCODING 183
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0078
+ENCODING 184
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+0f00
+0f00
+ENDCHAR
+STARTCHAR C0079
+ENCODING 185
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0fc0
+0fc0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C007a
+ENCODING 186
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0c30
+0c30
+03c0
+03c0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C007b
+ENCODING 187
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+f0f0
+f0f0
+3c3c
+3c3c
+f0f0
+f0f0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C007c
+ENCODING 191
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+00f0
+00f0
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C007d
+ENCODING 192
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C007e
+ENCODING 193
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00f0
+00f0
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C007f
+ENCODING 194
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+300c
+300c
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0080
+ENCODING 195
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+3cf0
+3cf0
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0081
+ENCODING 196
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+3c3c
+3c3c
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0082
+ENCODING 197
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0c30
+0c30
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C0083
+ENCODING 198
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ffc
+0ffc
+3fc0
+3fc0
+f3c0
+f3c0
+fffc
+fffc
+f3c0
+f3c0
+f3fc
+f3fc
+0000
+0000
+ENDCHAR
+STARTCHAR C0084
+ENCODING 199
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c00
+3c00
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+0f00
+0f00
+ENDCHAR
+STARTCHAR C0085
+ENCODING 201
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0086
+ENCODING 202
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+300c
+300c
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0087
+ENCODING 203
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+3ffc
+3ffc
+3c00
+3c00
+3ff0
+3ff0
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0088
+ENCODING 204
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0089
+ENCODING 205
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C008a
+ENCODING 206
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+300c
+300c
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C008b
+ENCODING 207
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C008c
+ENCODING 208
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+3cf0
+3cf0
+3c3c
+3c3c
+ff3c
+ff3c
+3cf0
+3cf0
+3fc0
+3fc0
+0000
+0000
+ENDCHAR
+STARTCHAR C008d
+ENCODING 209
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+3cf0
+3cf0
+0000
+0000
+3f3c
+3f3c
+3f3c
+3f3c
+3ffc
+3ffc
+3cfc
+3cfc
+0000
+0000
+ENDCHAR
+STARTCHAR C008e
+ENCODING 210
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+0ff0
+0ff0
+333c
+333c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C008f
+ENCODING 211
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+003c
+003c
+0ff0
+0ff0
+3ccc
+3ccc
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0090
+ENCODING 214
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0091
+ENCODING 215
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0092
+ENCODING 217
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0093
+ENCODING 218
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0094
+ENCODING 220
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0095
+ENCODING 221
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0096
+ENCODING 222
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3ff0
+3ff0
+3c3c
+3c3c
+3ff0
+3ff0
+3c00
+3c00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C0097
+ENCODING 223
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03f0
+03f0
+0f3c
+0f3c
+0ff0
+0ff0
+0f3c
+0f3c
+0f3f
+0f3f
+0ffc
+0ffc
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0098
+ENCODING 224
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0099
+ENCODING 225
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C009a
+ENCODING 226
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+300c
+300c
+0000
+0000
+0ff0
+0ff0
+00fc
+00fc
+0f3c
+0f3c
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C009b
+ENCODING 227
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+3cf0
+3cf0
+0000
+0000
+0ff0
+0ff0
+00fc
+00fc
+0f3c
+0f3c
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C009c
+ENCODING 228
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C009d
+ENCODING 229
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+3c3c
+3c3c
+03f0
+03f0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C009e
+ENCODING 230
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3f3c
+3f3c
+03cf
+03cf
+3ffc
+3ffc
+f3c0
+f3c0
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C009f
+ENCODING 231
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3c00
+3c00
+3c00
+3c00
+0ff0
+0ff0
+03c0
+03c0
+0f00
+0f00
+ENDCHAR
+STARTCHAR C00a0
+ENCODING 232
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a1
+ENCODING 233
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a2
+ENCODING 234
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+f00f
+f00f
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a3
+ENCODING 235
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a4
+ENCODING 236
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a5
+ENCODING 237
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a6
+ENCODING 238
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a7
+ENCODING 239
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a8
+ENCODING 240
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cc0
+3cc0
+0f00
+0f00
+33c0
+33c0
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00a9
+ENCODING 241
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+3cf0
+3cf0
+0000
+0000
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C00aa
+ENCODING 242
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00ab
+ENCODING 243
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00ac
+ENCODING 244
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00ad
+ENCODING 245
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+3cf0
+3cf0
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00ae
+ENCODING 246
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00af
+ENCODING 247
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00b0
+ENCODING 249
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00b1
+ENCODING 250
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00b2
+ENCODING 251
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+3c3c
+3c3c
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00b3
+ENCODING 252
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00b4
+ENCODING 253
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+00f0
+00f0
+3fc0
+3fc0
+ENDCHAR
+STARTCHAR C00b5
+ENCODING 254
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3fc0
+3fc0
+3cf0
+3cf0
+3fc0
+3fc0
+3c00
+3c00
+3c00
+3c00
+0000
+0000
+ENDCHAR
+STARTCHAR C00b6
+ENCODING 255
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c3c
+3c3c
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ffc
+0ffc
+00f0
+00f0
+3fc0
+3fc0
+ENDCHAR
+STARTCHAR C00b7
+ENCODING 260
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+3c3c
+3c3c
+000f
+000f
+ENDCHAR
+STARTCHAR C00b8
+ENCODING 261
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+000f
+000f
+ENDCHAR
+STARTCHAR C00b9
+ENCODING 262
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0ff0
+0ff0
+3cfc
+3cfc
+3c00
+3c00
+3c00
+3c00
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00ba
+ENCODING 263
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0ff0
+0ff0
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00bb
+ENCODING 280
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3fc0
+3fc0
+3c00
+3c00
+3fc0
+3fc0
+3c00
+3c00
+3ffc
+3ffc
+03c0
+03c0
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C00bc
+ENCODING 281
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3ffc
+3ffc
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+ENDCHAR
+STARTCHAR C00bd
+ENCODING 321
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+3c00
+3c00
+3fc0
+3fc0
+3f00
+3f00
+fc00
+fc00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00be
+ENCODING 322
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0fc0
+0fc0
+03c0
+03c0
+03f0
+03f0
+0fc0
+0fc0
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00bf
+ENCODING 323
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+33cc
+33cc
+3c3c
+3c3c
+3ffc
+3ffc
+3ffc
+3ffc
+3cfc
+3cfc
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C00c0
+ENCODING 324
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3ff0
+3ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+ENDCHAR
+STARTCHAR C00c1
+ENCODING 346
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0ff0
+0ff0
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+003c
+003c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00c2
+ENCODING 347
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+0ffc
+0ffc
+3c00
+3c00
+0ff0
+0ff0
+003c
+003c
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C00c3
+ENCODING 377
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3ffc
+3ffc
+0f3c
+0f3c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00c4
+ENCODING 378
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+03c0
+03c0
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00c5
+ENCODING 379
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3c00
+3c00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00c6
+ENCODING 380
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0000
+0000
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00c7
+ENCODING 551
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0000
+0000
+0ff0
+0ff0
+003c
+003c
+0ffc
+0ffc
+3c3c
+3c3c
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00c8
+ENCODING 1488
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+f03c
+f03c
+ff3c
+ff3c
+f3fc
+f3fc
+f0f0
+f0f0
+f03c
+f03c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00c9
+ENCODING 1489
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+ffc0
+ffc0
+03f0
+03f0
+00f0
+00f0
+00f0
+00f0
+fffc
+fffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00ca
+ENCODING 1490
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+00f0
+00f0
+00f0
+00f0
+3ff0
+3ff0
+fc3c
+fc3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00cb
+ENCODING 1491
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fffc
+fffc
+03f0
+03f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00cc
+ENCODING 1492
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+003c
+003c
+303c
+303c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00cd
+ENCODING 1493
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+03f0
+03f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00ce
+ENCODING 1494
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+3f00
+3f00
+0f00
+0f00
+0f00
+0f00
+0f00
+0f00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00cf
+ENCODING 1495
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d0
+ENCODING 1496
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+f3fc
+f3fc
+f33c
+f33c
+f03c
+f03c
+f03c
+f03c
+fff0
+fff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d1
+ENCODING 1497
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ff0
+3ff0
+03f0
+03f0
+00f0
+00f0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d2
+ENCODING 1498
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+00fc
+00fc
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+ENDCHAR
+STARTCHAR C00d3
+ENCODING 1499
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+003c
+003c
+003c
+003c
+00fc
+00fc
+fff0
+fff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d4
+ENCODING 1500
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+f000
+f000
+fff0
+fff0
+003c
+003c
+003c
+003c
+00fc
+00fc
+0ff0
+0ff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d5
+ENCODING 1501
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d6
+ENCODING 1502
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+f3f0
+f3f0
+3f3c
+3f3c
+3c3c
+3c3c
+3c3c
+3c3c
+3cfc
+3cfc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d7
+ENCODING 1503
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03fc
+03fc
+00fc
+00fc
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+ENDCHAR
+STARTCHAR C00d8
+ENCODING 1504
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03fc
+03fc
+003c
+003c
+003c
+003c
+00fc
+00fc
+3ff0
+3ff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00d9
+ENCODING 1505
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fffc
+fffc
+3c3c
+3c3c
+3c3c
+3c3c
+3cf0
+3cf0
+3fc0
+3fc0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00da
+ENCODING 1506
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fcfc
+fcfc
+3c3c
+3c3c
+0f3c
+0f3c
+0f3c
+0f3c
+fff0
+fff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00db
+ENCODING 1507
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+3cfc
+3cfc
+3c3c
+3c3c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+003c
+ENDCHAR
+STARTCHAR C00dc
+ENCODING 1508
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+3c3c
+3c3c
+3c3c
+3c3c
+00fc
+00fc
+fff0
+fff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00dd
+ENCODING 1509
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+f0fc
+f0fc
+3c3c
+3c3c
+3cf0
+3cf0
+3fc0
+3fc0
+3c00
+3c00
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C00de
+ENCODING 1510
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+f03c
+f03c
+3cfc
+3cfc
+0fc0
+0fc0
+00f0
+00f0
+fffc
+fffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00df
+ENCODING 1511
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+00fc
+00fc
+f03c
+f03c
+f0f0
+f0f0
+f3c0
+f3c0
+f000
+f000
+f000
+f000
+ENDCHAR
+STARTCHAR C00e0
+ENCODING 1512
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+00fc
+00fc
+003c
+003c
+003c
+003c
+003c
+003c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00e1
+ENCODING 1513
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+c30c
+c30c
+f30c
+f30c
+fc3c
+fc3c
+f0f0
+f0f0
+fff0
+fff0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00e2
+ENCODING 1514
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+fff0
+fff0
+3cfc
+3cfc
+3c3c
+3c3c
+3c3c
+3c3c
+fc3c
+fc3c
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00e3
+ENCODING 1567
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C00e4
+ENCODING 1569
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+03f0
+03f0
+0f00
+0f00
+03f0
+03f0
+0fc0
+0fc0
+0c00
+0c00
+0000
+0000
+ENDCHAR
+STARTCHAR C00e5
+ENCODING 1570
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C00e6
+ENCODING 1572
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+f0ff
+f0ff
+03cf
+03cf
+00ff
+00ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C00e7
+ENCODING 1575
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00e8
+ENCODING 1576
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+03c0
+03c0
+ENDCHAR
+STARTCHAR C00e9
+ENCODING 1577
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03cf
+03cf
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00ea
+ENCODING 1578
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00eb
+ENCODING 1579
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00ec
+ENCODING 1580
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c00
+3c00
+3c0f
+3c0f
+0fc0
+0fc0
+ENDCHAR
+STARTCHAR C00ed
+ENCODING 1581
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C00ee
+ENCODING 1582
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C00ef
+ENCODING 1583
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C00f0
+ENCODING 1584
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+0000
+0000
+00f0
+00f0
+003c
+003c
+000f
+000f
+000f
+000f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00f1
+ENCODING 1585
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C00f2
+ENCODING 1586
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+000f
+000f
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C00f3
+ENCODING 1587
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+c3fc
+c3fc
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C00f4
+ENCODING 1588
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0f0f
+0f0f
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C00f5
+ENCODING 1589
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C00f6
+ENCODING 1590
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ffc0
+ffc0
+3f00
+3f00
+ENDCHAR
+STARTCHAR C00f7
+ENCODING 1591
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00f8
+ENCODING 1592
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00f9
+ENCODING 1593
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C00fa
+ENCODING 1594
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C00fb
+ENCODING 1601
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+003f
+003f
+f0f3
+f0f3
+f03f
+f03f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C00fc
+ENCODING 1602
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+003f
+003f
+30f3
+30f3
+f03f
+f03f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00fd
+ENCODING 1603
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0f0f
+0f0f
+0c0f
+0c0f
+3f0f
+3f0f
+000f
+000f
+c00f
+c00f
+fffc
+fffc
+0000
+0000
+ENDCHAR
+STARTCHAR C00fe
+ENCODING 1604
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C00ff
+ENCODING 1605
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+03ff
+03ff
+0ff3
+0ff3
+3c3f
+3c3f
+3c0f
+3c0f
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0100
+ENCODING 1606
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+0c0c
+0c0c
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0101
+ENCODING 1607
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0102
+ENCODING 1608
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03ff
+03ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0103
+ENCODING 1609
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00fc
+00fc
+f3cf
+f3cf
+f3c3
+f3c3
+f0f3
+f0f3
+f0f0
+f0f0
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0104
+ENCODING 1610
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+c3ff
+c3ff
+c3c3
+c3c3
+f0f3
+f0f3
+3ff3
+3ff3
+0000
+0000
+0f3c
+0f3c
+ENDCHAR
+STARTCHAR C0105
+ENCODING 1632
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+3c00
+3c00
+3000
+3000
+0000
+0000
+ENDCHAR
+STARTCHAR C0106
+ENCODING 1633
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00c0
+00c0
+03f0
+03f0
+0ffc
+0ffc
+03f0
+03f0
+00c0
+00c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0107
+ENCODING 1634
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0108
+ENCODING 1635
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0ff0
+0ff0
+3c3c
+3c3c
+3c00
+3c00
+0f00
+0f00
+03c0
+03c0
+00f0
+00f0
+003c
+003c
+ENDCHAR
+STARTCHAR C0109
+ENCODING 1636
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ccf
+3ccf
+3ccf
+3ccf
+3fff
+3fff
+3f00
+3f00
+0f00
+0f00
+0fc0
+0fc0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C010a
+ENCODING 1637
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03fc
+03fc
+0fc0
+0fc0
+3f00
+3f00
+03f0
+03f0
+0fc0
+0fc0
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C010b
+ENCODING 1638
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03f0
+03f0
+0ffc
+0ffc
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3ffc
+3ffc
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C010c
+ENCODING 1639
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ff0
+3ff0
+3ff0
+3ff0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+00f0
+ENDCHAR
+STARTCHAR C010d
+ENCODING 1640
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+0ff0
+0ff0
+0ff0
+0ff0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C010e
+ENCODING 1641
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+0ff0
+0ff0
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+3c3c
+ENDCHAR
+STARTCHAR C010f
+ENCODING 8211
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0110
+ENCODING 8212
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0111
+ENCODING 8216
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+03c0
+03c0
+00f0
+00f0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0112
+ENCODING 8217
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00f0
+00f0
+03c0
+03c0
+0f00
+0f00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0113
+ENCODING 8220
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+0f0f
+0f0f
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0114
+ENCODING 8221
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c3c
+3c3c
+3c3c
+3c3c
+f0f0
+f0f0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0115
+ENCODING 8249
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0116
+ENCODING 8250
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+03c0
+03c0
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0117
+ENCODING 8364
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03fc
+03fc
+0f00
+0f00
+3ff0
+3ff0
+0f00
+0f00
+3ff0
+3ff0
+0f00
+0f00
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C0118
+ENCODING 8592
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0f00
+0f00
+3ffc
+3ffc
+0f00
+0f00
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0119
+ENCODING 8593
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+3ffc
+3ffc
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C011a
+ENCODING 8594
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+00f0
+00f0
+3ffc
+3ffc
+00f0
+00f0
+03c0
+03c0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C011b
+ENCODING 8595
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+3ffc
+3ffc
+0ff0
+0ff0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C011c
+ENCODING 8624
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3ffc
+3ffc
+3fc0
+3fc0
+3ff0
+3ff0
+3cfc
+3cfc
+3c3c
+3c3c
+003c
+003c
+0000
+0000
+ENDCHAR
+STARTCHAR C011d
+ENCODING 9243
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3fc0
+3fc0
+3c00
+3c00
+3fc0
+3fc0
+3c00
+3c00
+3ffc
+3ffc
+03c0
+03c0
+03fc
+03fc
+0000
+0000
+ENDCHAR
+STARTCHAR C011e
+ENCODING 9473
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+ffff
+ffff
+ffff
+ffff
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C011f
+ENCODING 9475
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+ENDCHAR
+STARTCHAR C0120
+ENCODING 9487
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+03ff
+03ff
+03ff
+03ff
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0121
+ENCODING 9491
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+ffc0
+ffc0
+ffc0
+ffc0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0122
+ENCODING 9495
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03ff
+03ff
+03ff
+03ff
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0123
+ENCODING 9499
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ffc0
+ffc0
+ffc0
+ffc0
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0124
+ENCODING 9507
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03ff
+03ff
+03ff
+03ff
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0125
+ENCODING 9515
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ffc0
+ffc0
+ffc0
+ffc0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0126
+ENCODING 9523
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+ffff
+ffff
+ffff
+ffff
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0127
+ENCODING 9531
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ffff
+ffff
+ffff
+ffff
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0128
+ENCODING 9547
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ffff
+ffff
+ffff
+ffff
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0129
+ENCODING 9585
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+003f
+003f
+00fc
+00fc
+03f0
+03f0
+0fc0
+0fc0
+3f00
+3f00
+fc00
+fc00
+f000
+f000
+ENDCHAR
+STARTCHAR C012a
+ENCODING 9586
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+f000
+f000
+fc00
+fc00
+3f00
+3f00
+0fc0
+0fc0
+03f0
+03f0
+00fc
+00fc
+003f
+003f
+000f
+000f
+ENDCHAR
+STARTCHAR C012b
+ENCODING 9601
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ffff
+ffff
+ffff
+ffff
+ENDCHAR
+STARTCHAR C012c
+ENCODING 9604
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ffff
+ffff
+ffff
+ffff
+ffff
+ffff
+ffff
+ffff
+ENDCHAR
+STARTCHAR C012d
+ENCODING 9612
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ENDCHAR
+STARTCHAR C012e
+ENCODING 9614
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+f000
+ENDCHAR
+STARTCHAR C012f
+ENCODING 9620
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+ffff
+ffff
+ffff
+ffff
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0130
+ENCODING 9622
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ENDCHAR
+STARTCHAR C0131
+ENCODING 9623
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+ENDCHAR
+STARTCHAR C0132
+ENCODING 9624
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+ff00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0133
+ENCODING 9629
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+00ff
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0134
+ENCODING 9654
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0300
+0300
+03c0
+03c0
+03f0
+03f0
+03fc
+03fc
+03f0
+03f0
+03c0
+03c0
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR C0135
+ENCODING 9664
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00c0
+00c0
+03c0
+03c0
+0fc0
+0fc0
+3fc0
+3fc0
+0fc0
+0fc0
+03c0
+03c0
+00c0
+00c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0136
+ENCODING 9670
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+3ffc
+3ffc
+3ffc
+3ffc
+0ff0
+0ff0
+03c0
+03c0
+0000
+0000
+ENDCHAR
+STARTCHAR C0137
+ENCODING 9679
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0ff0
+0ff0
+3ffc
+3ffc
+3ffc
+3ffc
+3ffc
+3ffc
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C0138
+ENCODING 9698
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0003
+0003
+000f
+000f
+003f
+003f
+00ff
+00ff
+03ff
+03ff
+0fff
+0fff
+3fff
+3fff
+ffff
+ffff
+ENDCHAR
+STARTCHAR C0139
+ENCODING 9699
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+c000
+c000
+f000
+f000
+fc00
+fc00
+ff00
+ff00
+ffc0
+ffc0
+fff0
+fff0
+fffc
+fffc
+ffff
+ffff
+ENDCHAR
+STARTCHAR C013a
+ENCODING 9824
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0ff0
+0ff0
+3ffc
+3ffc
+3ffc
+3ffc
+03c0
+03c0
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C013b
+ENCODING 9827
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03f0
+03f0
+03f0
+03f0
+3f3f
+3f3f
+3f3f
+3f3f
+00c0
+00c0
+03f0
+03f0
+0000
+0000
+ENDCHAR
+STARTCHAR C013c
+ENCODING 9829
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+3fff
+3fff
+3fff
+3fff
+0ffc
+0ffc
+03f0
+03f0
+00c0
+00c0
+0000
+0000
+ENDCHAR
+STARTCHAR C013d
+ENCODING 62456
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0c0f
+0c0f
+0f0f
+0f0f
+03cf
+03cf
+00cf
+00cf
+00fc
+00fc
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C013e
+ENCODING 65152
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+03f0
+03f0
+0f00
+0f00
+03f0
+03f0
+0fc0
+0fc0
+0c00
+0c00
+0000
+0000
+ENDCHAR
+STARTCHAR C013f
+ENCODING 65153
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0140
+ENCODING 65154
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0141
+ENCODING 65157
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+f0ff
+f0ff
+03cf
+03cf
+00ff
+00ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0142
+ENCODING 65158
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3c00
+3c00
+f0ff
+f0ff
+03cf
+03cf
+00ff
+00ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0143
+ENCODING 65165
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0144
+ENCODING 65166
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0145
+ENCODING 65167
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0146
+ENCODING 65168
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0147
+ENCODING 65169
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+003c
+003c
+ENDCHAR
+STARTCHAR C0148
+ENCODING 65170
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+03c0
+03c0
+ENDCHAR
+STARTCHAR C0149
+ENCODING 65171
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03cf
+03cf
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014a
+ENCODING 65172
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03cf
+03cf
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014b
+ENCODING 65173
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014c
+ENCODING 65174
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014d
+ENCODING 65175
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3cf0
+3cf0
+0000
+0000
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014e
+ENCODING 65176
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f3c
+0f3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C014f
+ENCODING 65177
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0150
+ENCODING 65178
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0151
+ENCODING 65179
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0152
+ENCODING 65180
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+f00f
+f00f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0153
+ENCODING 65181
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c00
+3c00
+3c0f
+3c0f
+0fc0
+0fc0
+ENDCHAR
+STARTCHAR C0154
+ENCODING 65182
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c00
+3c00
+3c0f
+3c0f
+0fc0
+0fc0
+ENDCHAR
+STARTCHAR C0155
+ENCODING 65183
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3fc0
+3fc0
+30f0
+30f0
+003c
+003c
+ffff
+ffff
+0000
+0000
+00f0
+00f0
+ENDCHAR
+STARTCHAR C0156
+ENCODING 65184
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c00
+3c00
+3c0f
+3c0f
+0fc0
+0fc0
+ENDCHAR
+STARTCHAR C0157
+ENCODING 65185
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C0158
+ENCODING 65186
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C0159
+ENCODING 65187
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3fc0
+3fc0
+30f0
+30f0
+003c
+003c
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C015a
+ENCODING 65188
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C015b
+ENCODING 65189
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C015c
+ENCODING 65190
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C015d
+ENCODING 65191
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+0000
+0000
+3fc0
+3fc0
+30f0
+30f0
+003c
+003c
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C015e
+ENCODING 65192
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+3fc0
+3fc0
+00f0
+00f0
+0ffc
+0ffc
+3c0f
+3c0f
+3c03
+3c03
+3c00
+3c00
+0ff0
+0ff0
+ENDCHAR
+STARTCHAR C015f
+ENCODING 65193
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0160
+ENCODING 65194
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0161
+ENCODING 65195
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+0000
+0000
+00f0
+00f0
+003c
+003c
+000f
+000f
+000f
+000f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0162
+ENCODING 65196
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+0000
+0000
+00f0
+00f0
+003c
+003c
+000f
+000f
+000f
+000f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0163
+ENCODING 65197
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0164
+ENCODING 65198
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0165
+ENCODING 65199
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+000f
+000f
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0166
+ENCODING 65200
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+000f
+000f
+0000
+0000
+003c
+003c
+000f
+000f
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C0167
+ENCODING 65201
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+c3fc
+c3fc
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0168
+ENCODING 65202
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+c3fc
+c3fc
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0169
+ENCODING 65203
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+30c3
+30c3
+f3cf
+f3cf
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C016a
+ENCODING 65204
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+c3fc
+c3fc
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C016b
+ENCODING 65205
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0f0f
+0f0f
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C016c
+ENCODING 65206
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0f0f
+0f0f
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C016d
+ENCODING 65207
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+3c3c
+3c3c
+0000
+0000
+30c3
+30c3
+f3cf
+f3cf
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C016e
+ENCODING 65208
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0f0f
+0f0f
+0000
+0000
+c333
+c333
+c333
+c333
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C016f
+ENCODING 65209
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0170
+ENCODING 65210
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0171
+ENCODING 65211
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+33c3
+33c3
+ff03
+ff03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0172
+ENCODING 65212
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ff00
+ff00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0173
+ENCODING 65213
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ffc0
+ffc0
+3f00
+3f00
+ENDCHAR
+STARTCHAR C0174
+ENCODING 65214
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ffc0
+ffc0
+3f00
+3f00
+ENDCHAR
+STARTCHAR C0175
+ENCODING 65215
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+03c0
+03c0
+0000
+0000
+00ff
+00ff
+33c3
+33c3
+ff03
+ff03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0176
+ENCODING 65216
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+00f0
+00f0
+0000
+0000
+00ff
+00ff
+c3c3
+c3c3
+c303
+c303
+c3ff
+c3ff
+ffc0
+ffc0
+3f00
+3f00
+ENDCHAR
+STARTCHAR C0177
+ENCODING 65217
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0178
+ENCODING 65218
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0179
+ENCODING 65219
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017a
+ENCODING 65220
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017b
+ENCODING 65221
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017c
+ENCODING 65222
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017d
+ENCODING 65223
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017e
+ENCODING 65224
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+3c00
+3c00
+3cff
+3cff
+3fc3
+3fc3
+3f03
+3f03
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C017f
+ENCODING 65225
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0180
+ENCODING 65226
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0181
+ENCODING 65227
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03f0
+03f0
+0ffc
+0ffc
+0f00
+0f00
+03c0
+03c0
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0182
+ENCODING 65228
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0183
+ENCODING 65229
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0184
+ENCODING 65230
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0185
+ENCODING 65231
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+03f0
+03f0
+0ffc
+0ffc
+0f00
+0f00
+03c0
+03c0
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0186
+ENCODING 65232
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3c00
+3c00
+00fc
+00fc
+03c0
+03c0
+03c0
+03c0
+0fff
+0fff
+3c03
+3c03
+3f00
+3f00
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0187
+ENCODING 65233
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+003f
+003f
+f0f3
+f0f3
+f03f
+f03f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0188
+ENCODING 65234
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+003f
+003f
+f0f3
+f0f3
+f03f
+f03f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0189
+ENCODING 65235
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f00
+0f00
+0000
+0000
+00ff
+00ff
+00f3
+00f3
+003f
+003f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C018a
+ENCODING 65236
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0f00
+0f00
+003f
+003f
+f0f3
+f0f3
+f03f
+f03f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C018b
+ENCODING 65237
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+003f
+003f
+30f3
+30f3
+f03f
+f03f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C018c
+ENCODING 65238
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+003f
+003f
+30f3
+30f3
+f03f
+f03f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C018d
+ENCODING 65239
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+3cf0
+3cf0
+0000
+0000
+03ff
+03ff
+03c3
+03c3
+00ff
+00ff
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C018e
+ENCODING 65240
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0f3c
+0f3c
+0000
+0000
+003f
+003f
+30f3
+30f3
+f03f
+f03f
+f00f
+f00f
+3ffc
+3ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C018f
+ENCODING 65241
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0f0f
+0f0f
+0c0f
+0c0f
+3f0f
+3f0f
+000f
+000f
+c00f
+c00f
+fffc
+fffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0190
+ENCODING 65242
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0f0f
+0f0f
+0c0f
+0c0f
+3f0f
+3f0f
+000f
+000f
+c00f
+c00f
+fffc
+fffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0191
+ENCODING 65243
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+03f0
+03f0
+003c
+003c
+000f
+000f
+000f
+000f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0192
+ENCODING 65244
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0f0f
+0f0f
+0c0f
+0c0f
+3f0f
+3f0f
+000f
+000f
+c00f
+c00f
+fffc
+fffc
+0000
+0000
+ENDCHAR
+STARTCHAR C0193
+ENCODING 65245
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0194
+ENCODING 65246
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0195
+ENCODING 65247
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C0196
+ENCODING 65248
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+000f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+ENDCHAR
+STARTCHAR C0197
+ENCODING 65249
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+03ff
+03ff
+0ff3
+0ff3
+3c3f
+3c3f
+3c0f
+3c0f
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0198
+ENCODING 65250
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+03ff
+03ff
+0ff3
+0ff3
+3c3f
+3c3f
+3c0f
+3c0f
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C0199
+ENCODING 65251
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+003f
+003f
+00f3
+00f3
+fff3
+fff3
+003f
+003f
+0000
+0000
+ENDCHAR
+STARTCHAR C019a
+ENCODING 65252
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+003c
+003c
+03ff
+03ff
+0ff3
+0ff3
+3c3f
+3c3f
+3c0f
+3c0f
+3c00
+3c00
+3c00
+3c00
+ENDCHAR
+STARTCHAR C019b
+ENCODING 65253
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+0c0c
+0c0c
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C019c
+ENCODING 65254
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+0c0c
+0c0c
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C019d
+ENCODING 65255
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00f0
+00f0
+0000
+0000
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C019e
+ENCODING 65256
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+03c0
+03c0
+0000
+0000
+0c0c
+0c0c
+3c0f
+3c0f
+3c0f
+3c0f
+0ffc
+0ffc
+0000
+0000
+ENDCHAR
+STARTCHAR C019f
+ENCODING 65257
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C01a0
+ENCODING 65258
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C01a1
+ENCODING 65259
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0300
+0300
+0ffc
+0ffc
+0c3f
+0c3f
+0fc3
+0fc3
+ffff
+ffff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C01a2
+ENCODING 65260
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03cf
+03cf
+03ff
+03ff
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C01a3
+ENCODING 65261
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03ff
+03ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C01a4
+ENCODING 65262
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00ff
+00ff
+03cf
+03cf
+03ff
+03ff
+000f
+000f
+003c
+003c
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C01a5
+ENCODING 65263
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00fc
+00fc
+f3cf
+f3cf
+f3c3
+f3c3
+f0f3
+f0f3
+f0f0
+f0f0
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C01a6
+ENCODING 65264
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+00fc
+00fc
+f3cf
+f3cf
+f3c3
+f3c3
+f0f3
+f0f3
+f0f0
+f0f0
+3ff0
+3ff0
+ENDCHAR
+STARTCHAR C01a7
+ENCODING 65265
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+c3ff
+c3ff
+c3c3
+c3c3
+f0f3
+f0f3
+3ff3
+3ff3
+0000
+0000
+0f3c
+0f3c
+ENDCHAR
+STARTCHAR C01a8
+ENCODING 65266
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+c3ff
+c3ff
+c3c3
+c3c3
+f0f3
+f0f3
+3ff3
+3ff3
+0000
+0000
+0f3c
+0f3c
+ENDCHAR
+STARTCHAR C01a9
+ENCODING 65267
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+000f
+000f
+000f
+000f
+ffff
+ffff
+0000
+0000
+0f3c
+0f3c
+ENDCHAR
+STARTCHAR C01aa
+ENCODING 65268
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0000
+0000
+00fc
+00fc
+c3ff
+c3ff
+c3c3
+c3c3
+f0f3
+f0f3
+3ff3
+3ff3
+0000
+0000
+0f3c
+0f3c
+ENDCHAR
+STARTCHAR C01ab
+ENCODING 65271
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+000f
+000f
+0c0f
+0c0f
+0f0f
+0f0f
+03cf
+03cf
+00cf
+00cf
+00fc
+00fc
+3ff0
+3ff0
+0000
+0000
+ENDCHAR
+STARTCHAR C01ac
+ENCODING 65533
+SWIDTH 666 0
+DWIDTH 16 0
+BBX 16 16 0 -4
+BITMAP
+0ff0
+0ff0
+3c3c
+3c3c
+33cc
+33cc
+3f3c
+3f3c
+3ffc
+3ffc
+3f3c
+3f3c
+0ff0
+0ff0
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/fonts/fauxtari-16.psf b/fonts/fauxtari-16.psf
new file mode 100644
index 0000000..8462735
--- /dev/null
+++ b/fonts/fauxtari-16.psf
Binary files differ
diff --git a/fonts/fauxtari-16.txt b/fonts/fauxtari-16.txt
new file mode 100644
index 0000000..1f450d9
--- /dev/null
+++ b/fonts/fauxtari-16.txt
@@ -0,0 +1,4796 @@
+%PSF2
+Version: 0
+Flags: 1
+Length: 512
+Width: 16
+Height: 16
+%
+Unicode: [2665];
+Bitmap: \
+-------------------------------- \
+----####--####------####--####-- \
+--##############--############## \
+--##############--############## \
+----##########------##########-- \
+------######----------######---- \
+--------##--------------##------ \
+--------------------------------
+%
+Unicode: [2523];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------##########------########## \
+------##########------########## \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [2503];
+Bitmap: \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------####
+%
+Unicode: [251b];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+##########------##########------ \
+##########------##########------ \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [252b];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+##########------##########------ \
+##########------##########------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [2513];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+##########------##########------ \
+##########------##########------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [2571];
+Bitmap: \
+------------####------------#### \
+----------######----------###### \
+--------######----------######-- \
+------######----------######---- \
+----######----------######------ \
+--######----------######-------- \
+######----------######---------- \
+####------------####------------
+%
+Unicode: [2572];
+Bitmap: \
+####------------####------------ \
+######----------######---------- \
+--######----------######-------- \
+----######----------######------ \
+------######----------######---- \
+--------######----------######-- \
+----------######----------###### \
+------------####------------####
+%
+Unicode: [25e2];
+Bitmap: \
+--------------##--------------## \
+------------####------------#### \
+----------######----------###### \
+--------########--------######## \
+------##########------########## \
+----############----############ \
+--##############--############## \
+################################
+%
+Unicode: [2597];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------########--------######## \
+--------########--------######## \
+--------########--------######## \
+--------########--------########
+%
+Unicode: [25e3];
+Bitmap: \
+##--------------##-------------- \
+####------------####------------ \
+######----------######---------- \
+########--------########-------- \
+##########------##########------ \
+############----############---- \
+##############--##############-- \
+################################
+%
+Unicode: [259d];
+Bitmap: \
+--------########--------######## \
+--------########--------######## \
+--------########--------######## \
+--------########--------######## \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [2598];
+Bitmap: \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [2594];
+Bitmap: \
+################################ \
+################################ \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [2581];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+################################ \
+################################
+%
+Unicode: [2596];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########--------
+%
+Unicode: [2663];
+Bitmap: \
+-------------------------------- \
+------######----------######---- \
+------######----------######---- \
+--######--######--######--###### \
+--######--######--######--###### \
+--------##--------------##------ \
+------######----------######---- \
+--------------------------------
+%
+Unicode: [250f];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+------##########------########## \
+------##########------########## \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [2501];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+################################ \
+################################ \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [254b];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+################################ \
+################################ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [25cf];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--############----############-- \
+--############----############-- \
+--############----############-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [2584];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+################################ \
+################################ \
+################################ \
+################################
+%
+Unicode: [258e];
+Bitmap: \
+####------------####------------ \
+####------------####------------ \
+####------------####------------ \
+####------------####------------ \
+####------------####------------ \
+####------------####------------ \
+####------------####------------ \
+####------------####------------
+%
+Unicode: [2533];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+################################ \
+################################ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [253b];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+################################ \
+################################ \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [258c];
+Bitmap: \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########-------- \
+########--------########--------
+%
+Unicode: [2517];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------##########------########## \
+------##########------########## \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0118];[241b];
+Bitmap: \
+--########--------########------ \
+--####------------####---------- \
+--########--------########------ \
+--####------------####---------- \
+--############----############-- \
+------####------------####------ \
+------########--------########-- \
+--------------------------------
+%
+Unicode: [2191];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+--############----############-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [2193];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--############----############-- \
+----########--------########---- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [2190];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+----####------------####-------- \
+------####------------####------ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [2192];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+--------####------------####---- \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0020];[00a0];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0021];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0022];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0023];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+################################ \
+--####----####----####----####-- \
+--####----####----####----####-- \
+################################ \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0024];
+Bitmap: \
+------####------------####------ \
+----##########------##########-- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####-- \
+--##########------##########---- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0025];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+------####------------####------ \
+----####------------####-------- \
+--####----####----####----####-- \
+--##------####----##------####-- \
+--------------------------------
+%
+Unicode: [0026];
+Bitmap: \
+------######----------######---- \
+----####--####------####--####-- \
+------######----------######---- \
+----######----------######------ \
+--####--########--####--######## \
+--####----####----####----####-- \
+----######--####----######--#### \
+--------------------------------
+%
+Unicode: [0027];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0028];
+Bitmap: \
+-------------------------------- \
+--------######----------######-- \
+------######----------######---- \
+------####------------####------ \
+------####------------####------ \
+------######----------######---- \
+--------######----------######-- \
+--------------------------------
+%
+Unicode: [0029];
+Bitmap: \
+-------------------------------- \
+--######----------######-------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+----######----------######------ \
+--######----------######-------- \
+--------------------------------
+%
+Unicode: [002a];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+----########--------########---- \
+################################ \
+----########--------########---- \
+--####----####----####----####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [002b];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+--############----############-- \
+------####------------####------ \
+------####------------####------ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [002c];[00b8];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+----####------------####--------
+%
+Unicode: [002d];[00ad];[2013];[2014];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--############----############-- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [002e];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [002f];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--####------------####---------- \
+--##--------------##------------ \
+--------------------------------
+%
+Unicode: [0030];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####--######----####--######-- \
+--######--####----######--####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0031];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0032];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0033];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+--------####------------####---- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0034];
+Bitmap: \
+-------------------------------- \
+--------####------------####---- \
+------######----------######---- \
+----########--------########---- \
+--####--####------####--####---- \
+--############----############-- \
+--------####------------####---- \
+--------------------------------
+%
+Unicode: [0035];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--####------------####---------- \
+--##########------##########---- \
+----------####------------####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0036];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####------------####---------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0037];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+----------####------------####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+----####------------####-------- \
+--------------------------------
+%
+Unicode: [0038];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0039];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+----##########------##########-- \
+----------####------------####-- \
+--------####------------####---- \
+----######----------######------ \
+--------------------------------
+%
+Unicode: [003a];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [003b];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+----####------------####--------
+%
+Unicode: [003c];
+Bitmap: \
+----------####------------####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+------####------------####------ \
+--------####------------####---- \
+----------####------------####-- \
+--------------------------------
+%
+Unicode: [003d];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--############----############-- \
+-------------------------------- \
+-------------------------------- \
+--############----############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [003e];
+Bitmap: \
+--####------------####---------- \
+----####------------####-------- \
+------####------------####------ \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--####------------####---------- \
+--------------------------------
+%
+Unicode: [003f];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--------####------------####---- \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0040];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####--######----####--######-- \
+--####--######----####--######-- \
+--####------------####---------- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0041];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0042];
+Bitmap: \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--##########------##########---- \
+--------------------------------
+%
+Unicode: [0043];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####------------####---------- \
+--####------------####---------- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0044];
+Bitmap: \
+-------------------------------- \
+--########--------########------ \
+--####--####------####--####---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+--########--------########------ \
+--------------------------------
+%
+Unicode: [0045];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--####------------####---------- \
+--##########------##########---- \
+--####------------####---------- \
+--####------------####---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0046];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--####------------####---------- \
+--##########------##########---- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+--------------------------------
+%
+Unicode: [0047];
+Bitmap: \
+-------------------------------- \
+----##########------##########-- \
+--####------------####---------- \
+--####------------####---------- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0048];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0049];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--############----############-- \
+--------------------------------
+%
+Unicode: [004a];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [004b];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+--########--------########------ \
+--########--------########------ \
+--####--####------####--####---- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [004c];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [004d];
+Bitmap: \
+-------------------------------- \
+--####------####--####------#### \
+--######--######--######--###### \
+--##############--############## \
+--####--##--####--####--##--#### \
+--####------####--####------#### \
+--####------####--####------#### \
+--------------------------------
+%
+Unicode: [004e];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--######--####----######--####-- \
+--############----############-- \
+--############----############-- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [004f];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0050];
+Bitmap: \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--##########------##########---- \
+--####------------####---------- \
+--####------------####---------- \
+--------------------------------
+%
+Unicode: [0051];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+----####--####------####--####-- \
+--------------------------------
+%
+Unicode: [0052];
+Bitmap: \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--##########------##########---- \
+--####--####------####--####---- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0053];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####-- \
+----------####------------####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0054];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0055];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0056];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0057];
+Bitmap: \
+-------------------------------- \
+--####------####--####------#### \
+--####------####--####------#### \
+--####--##--####--####--##--#### \
+--##############--############## \
+--######--######--######--###### \
+--####------####--####------#### \
+--------------------------------
+%
+Unicode: [0058];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0059];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [005a];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--####------------####---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [005b];
+Bitmap: \
+-------------------------------- \
+------########--------########-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------########--------########-- \
+--------------------------------
+%
+Unicode: [005c];
+Bitmap: \
+-------------------------------- \
+--##--------------##------------ \
+--####------------####---------- \
+----####------------####-------- \
+------####------------####------ \
+--------####------------####---- \
+----------####------------####-- \
+--------------------------------
+%
+Unicode: [005d];
+Bitmap: \
+-------------------------------- \
+--########--------########------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--########--------########------ \
+--------------------------------
+%
+Unicode: [005e];
+Bitmap: \
+-------------------------------- \
+--------##--------------##------ \
+------######----------######---- \
+----####--####------####--####-- \
+--####------####--####------#### \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [005f];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+################################ \
+--------------------------------
+%
+Unicode: [25c6];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+--############----############-- \
+--############----############-- \
+----########--------########---- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0061];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0062];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+--####------------####---------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--##########------##########---- \
+--------------------------------
+%
+Unicode: [0063];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0064];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0065];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0066];
+Bitmap: \
+-------------------------------- \
+--------######----------######-- \
+------####------------####------ \
+----##########------##########-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0067];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----##########------##########-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+----------####------------####-- \
+--##########------##########----
+%
+Unicode: [0068];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+--####------------####---------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0069];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [006a];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+-------------------------------- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----########--------########----
+%
+Unicode: [006b];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+--####------------####---------- \
+--####--####------####--####---- \
+--########--------########------ \
+--####--####------####--####---- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [006c];
+Bitmap: \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [006d];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####----####----####----####-- \
+--##############--############## \
+--##############--############## \
+--####--##--####--####--##--#### \
+--####------####--####------#### \
+--------------------------------
+%
+Unicode: [006e];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [006f];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0070];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--##########------##########---- \
+--####------------####---------- \
+--####------------####----------
+%
+Unicode: [0071];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----##########------##########-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+----------####------------####-- \
+----------####------------####--
+%
+Unicode: [0072];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+--------------------------------
+%
+Unicode: [0073];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----##########------##########-- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####-- \
+--##########------##########---- \
+--------------------------------
+%
+Unicode: [0074];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+--############----############-- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------######----------######-- \
+--------------------------------
+%
+Unicode: [0075];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0076];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [0077];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####------####--####------#### \
+--####--##--####--####--##--#### \
+--##############--############## \
+----##########------##########-- \
+----####--####------####--####-- \
+--------------------------------
+%
+Unicode: [0078];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####----####----####----####-- \
+----########--------########---- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0079];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------####------------####---- \
+--########--------########------
+%
+Unicode: [007a];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [2660];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+--############----############-- \
+--############----############-- \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [007c];[0622];[fe81];[fe82];
+Bitmap: \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [21b0];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--########--------########------ \
+--##########------##########---- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+----------####------------####-- \
+--------------------------------
+%
+Unicode: [25c0];
+Bitmap: \
+--------##--------------##------ \
+------####------------####------ \
+----######----------######------ \
+--########--------########------ \
+----######----------######------ \
+------####------------####------ \
+--------##--------------##------ \
+--------------------------------
+%
+Unicode: [25b6];
+Bitmap: \
+------##--------------##-------- \
+------####------------####------ \
+------######----------######---- \
+------########--------########-- \
+------######----------######---- \
+------####------------####------ \
+------##--------------##-------- \
+--------------------------------
+%
+Unicode: [00e1];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00f9];
+Bitmap: \
+----####------------####-------- \
+------####------------####------ \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00d1];
+Bitmap: \
+----####--####------####--####-- \
+--####--####------####--####---- \
+-------------------------------- \
+--######--####----######--####-- \
+--######--####----######--####-- \
+--############----############-- \
+--####--######----####--######-- \
+--------------------------------
+%
+Unicode: [00c9];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+--############----############-- \
+--####------------####---------- \
+--##########------##########---- \
+--####------------####---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [00e7];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--####------------####---------- \
+--####------------####---------- \
+----########--------########---- \
+------####------------####------ \
+----####------------####--------
+%
+Unicode: [00f4];
+Bitmap: \
+----########--------########---- \
+--####----####----####----####-- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00f2];
+Bitmap: \
+----####------------####-------- \
+------####------------####------ \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00ec];
+Bitmap: \
+----####------------####-------- \
+------####------------####------ \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00a3];
+Bitmap: \
+------######----------######---- \
+----####------------####-------- \
+----####------------####-------- \
+--########--------########------ \
+----####------------####-------- \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [00ef];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00fc];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00e4];
+Bitmap: \
+----####--####------####--####-- \
+-------------------------------- \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00d6];
+Bitmap: \
+--####----####----####----####-- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00fa];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00f3];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00f6];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00dc];
+Bitmap: \
+--####----####----####----####-- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [00e5];
+Bitmap: \
+----########--------########---- \
+--####----####----####----####-- \
+------######----------######---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00fb];
+Bitmap: \
+----########--------########---- \
+--####----####----####----####-- \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00ee];
+Bitmap: \
+----########--------########---- \
+--####----####----####----####-- \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00e9];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00e8];
+Bitmap: \
+----####------------####-------- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [00f1];
+Bitmap: \
+----####--####------####--####-- \
+--####--####------####--####---- \
+-------------------------------- \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [00ea];
+Bitmap: \
+----########--------########---- \
+####--------########--------#### \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0227];
+Bitmap: \
+------####------------####------ \
+-------------------------------- \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00e0];
+Bitmap: \
+----####------------####-------- \
+------####------------####------ \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [00a1];
+Bitmap: \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+--------------------------------
+%
+Unicode: [00c4];
+Bitmap: \
+--####----####----####----####-- \
+--####----####----####----####-- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [05d0];
+Bitmap: \
+-------------------------------- \
+####------####--####------####-- \
+########--####--########--####-- \
+####--########--####--########-- \
+####----####----####----####---- \
+####------####--####------####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d1];
+Bitmap: \
+-------------------------------- \
+##########------##########------ \
+------######----------######---- \
+--------####------------####---- \
+--------####------------####---- \
+##############--##############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d2];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--------####------------####---- \
+--------####------------####---- \
+--##########------##########---- \
+######----####--######----####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d3];
+Bitmap: \
+-------------------------------- \
+##############--##############-- \
+------######----------######---- \
+--------####------------####---- \
+--------####------------####---- \
+--------####------------####---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d4];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+----------####------------####-- \
+--##------####----##------####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d5];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+------######----------######---- \
+--------####------------####---- \
+--------####------------####---- \
+--------####------------####---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d6];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--######----------######-------- \
+----####------------####-------- \
+----####------------####-------- \
+----####------------####-------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d7];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d8];
+Bitmap: \
+-------------------------------- \
+####--########--####--########-- \
+####--##--####--####--##--####-- \
+####------####--####------####-- \
+####------####--####------####-- \
+############----############---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05d9];
+Bitmap: \
+-------------------------------- \
+--##########------##########---- \
+------######----------######---- \
+--------####------------####---- \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05da];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--------######----------######-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####--
+%
+Unicode: [05db];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+----------####------------####-- \
+----------####------------####-- \
+--------######----------######-- \
+############----############---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05dc];
+Bitmap: \
+####------------####------------ \
+############----############---- \
+----------####------------####-- \
+----------####------------####-- \
+--------######----------######-- \
+----########--------########---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05dd];
+Bitmap: \
+-------------------------------- \
+--############----############-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05de];
+Bitmap: \
+-------------------------------- \
+####--######----####--######---- \
+--######--####----######--####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####--######----####--######-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05df];
+Bitmap: \
+-------------------------------- \
+------########--------########-- \
+--------######----------######-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####--
+%
+Unicode: [05e0];
+Bitmap: \
+-------------------------------- \
+------########--------########-- \
+----------####------------####-- \
+----------####------------####-- \
+--------######----------######-- \
+--##########------##########---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e1];
+Bitmap: \
+-------------------------------- \
+##############--##############-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+--########--------########------ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e2];
+Bitmap: \
+-------------------------------- \
+######--######--######--######-- \
+--####----####----####----####-- \
+----####--####------####--####-- \
+----####--####------####--####-- \
+############----############---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e3];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####--
+%
+Unicode: [05e4];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------######----------######-- \
+############----############---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e5];
+Bitmap: \
+-------------------------------- \
+####----######--####----######-- \
+--####----####----####----####-- \
+--####--####------####--####---- \
+--########--------########------ \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####----------
+%
+Unicode: [05e6];
+Bitmap: \
+-------------------------------- \
+####------####--####------####-- \
+--####--######----####--######-- \
+----######----------######------ \
+--------####------------####---- \
+##############--##############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e7];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--------######----------######-- \
+####------####--####------####-- \
+####----####----####----####---- \
+####--####------####--####------ \
+####------------####------------ \
+####------------####------------
+%
+Unicode: [05e8];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--------######----------######-- \
+----------####------------####-- \
+----------####------------####-- \
+----------####------------####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05e9];
+Bitmap: \
+-------------------------------- \
+##----##----##--##----##----##-- \
+####--##----##--####--##----##-- \
+######----####--######----####-- \
+####----####----####----####---- \
+############----############---- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [05ea];
+Bitmap: \
+-------------------------------- \
+############----############---- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+######----####--######----####-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0179];
+Bitmap: \
+------####------------####------ \
+--############----############-- \
+----####--####------####--####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0105];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+----------####------------####-- \
+----##########------##########-- \
+--####----####----####----####-- \
+----##########------##########-- \
+------------####------------####
+%
+Unicode: [017a];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0107];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+----########--------########---- \
+--####------------####---------- \
+--####------------####---------- \
+--####------------####---------- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [015a];
+Bitmap: \
+------####------------####------ \
+----########--------########---- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####-- \
+----------####------------####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0119];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--############----############-- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####--
+%
+Unicode: [00df];
+Bitmap: \
+-------------------------------- \
+------######----------######---- \
+----####--####------####--####-- \
+----########--------########---- \
+----####--####------####--####-- \
+----####--######----####--###### \
+----##########------##########-- \
+--####------------####----------
+%
+Unicode: [0141];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+--####------------####---------- \
+--########--------########------ \
+--######----------######-------- \
+######----------######---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0142];
+Bitmap: \
+-------------------------------- \
+----######----------######------ \
+------####------------####------ \
+------######----------######---- \
+----######----------######------ \
+------####------------####------ \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [0143];
+Bitmap: \
+--------####------------####---- \
+--##--####--##----##--####--##-- \
+--####----####----####----####-- \
+--############----############-- \
+--############----############-- \
+--####--######----####--######-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [0144];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+--##########------##########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--------------------------------
+%
+Unicode: [00d3];
+Bitmap: \
+----------####------------####-- \
+----########--------########---- \
+--####--##--##----####--##--##-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+--------------------------------
+%
+Unicode: [015b];
+Bitmap: \
+--------####------------####---- \
+------####------------####------ \
+----##########------##########-- \
+--####------------####---------- \
+----########--------########---- \
+----------####------------####-- \
+--##########------##########---- \
+--------------------------------
+%
+Unicode: [0106];
+Bitmap: \
+--------####------------####---- \
+----########--------########---- \
+--####--######----####--######-- \
+--####------------####---------- \
+--####------------####---------- \
+--####----####----####----####-- \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0104];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+--####----####----####----####-- \
+------------####------------####
+%
+Unicode: [017b];
+Bitmap: \
+------####------------####------ \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--####------------####---------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [017c];
+Bitmap: \
+------####------------####------ \
+-------------------------------- \
+--############----############-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0660];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+--------####------------####---- \
+------####------------####------ \
+----####------------####-------- \
+--####------------####---------- \
+--##--------------##------------ \
+--------------------------------
+%
+Unicode: [0661];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------##--------------##------ \
+------######----------######---- \
+----##########------##########-- \
+------######----------######---- \
+--------##--------------##------ \
+--------------------------------
+%
+Unicode: [0662];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------ \
+------####------------####------
+%
+Unicode: [0663];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+--####------------####---------- \
+----####------------####-------- \
+------####------------####------ \
+--------####------------####---- \
+----------####------------####--
+%
+Unicode: [0664];
+Bitmap: \
+-------------------------------- \
+--####--##--####--####--##--#### \
+--####--##--####--####--##--#### \
+--##############--############## \
+--######----------######-------- \
+----####------------####-------- \
+----######----------######------ \
+------####------------####------
+%
+Unicode: [0665];
+Bitmap: \
+-------------------------------- \
+------########--------########-- \
+----######----------######------ \
+--######----------######-------- \
+------######----------######---- \
+----######----------######------ \
+--######----------######-------- \
+----##########------##########--
+%
+Unicode: [0666];
+Bitmap: \
+-------------------------------- \
+------######----------######---- \
+----##########------##########-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--############----############-- \
+----########--------########----
+%
+Unicode: [0667];
+Bitmap: \
+-------------------------------- \
+--##########------##########---- \
+--##########------##########---- \
+--------####------------####---- \
+--------####------------####---- \
+--------####------------####---- \
+--------####------------####---- \
+--------####------------####----
+%
+Unicode: [0668];
+Bitmap: \
+-------------------------------- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+----########--------########---- \
+----########--------########---- \
+------####------------####------
+%
+Unicode: [0669];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+----########--------########---- \
+----########--------########---- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####-- \
+--####----####----####----####--
+%
+Unicode: [0624];[fe85];[fe86];
+Bitmap: \
+-------------------------------- \
+--####------------####---------- \
+####----############----######## \
+------####--####------####--#### \
+--------########--------######## \
+------------####------------#### \
+----------####------------####-- \
+--##########------##########----
+%
+Unicode: [0634];[feb5];[feb6];[feb8];
+Bitmap: \
+--------####------------####---- \
+----####----####----####----#### \
+-------------------------------- \
+##----##--##--####----##--##--## \
+##----##--##--####----##--##--## \
+##----############----########## \
+########--------########-------- \
+--####------------####----------
+%
+Unicode: [0648];[feed];[feee];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------########--------######## \
+------####--####------####--#### \
+------##########------########## \
+------------####------------#### \
+----------####------------####-- \
+--##########------##########----
+%
+Unicode: [0629];[fe93];[fe94];
+Bitmap: \
+------####--####------####--#### \
+-------------------------------- \
+--------########--------######## \
+------####--####------####--#### \
+------####--####------####--#### \
+------##########------########## \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [064a];[fef1];[fef2];[fef4];
+Bitmap: \
+-------------------------------- \
+--------######----------######-- \
+##----############----########## \
+##----####----####----####----## \
+####----####--######----####--## \
+--##########--##--##########--## \
+-------------------------------- \
+----####--####------####--####--
+%
+Unicode: [062b];[fe99];[fe9a];[fe9c];
+Bitmap: \
+------####------------####------ \
+--####----####----####----####-- \
+-------------------------------- \
+####--------########--------#### \
+####--------########--------#### \
+--############----############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0628];[fe8f];[fe90];[fe92];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+####--------########--------#### \
+####--------########--------#### \
+--############----############-- \
+-------------------------------- \
+------####------------####------
+%
+Unicode: [0644];[fedd];[fede];[fee0];
+Bitmap: \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+--####------####--####------#### \
+--####------####--####------#### \
+--####------####--####------#### \
+----##########------##########--
+%
+Unicode: [0621];[fe80];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+------######----------######---- \
+----####------------####-------- \
+------######----------######---- \
+----######----------######------ \
+----##--------------##---------- \
+--------------------------------
+%
+Unicode: [0647];[fee9];[feea];[feec];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------########--------######## \
+------####--####------####--#### \
+------####--####------####--#### \
+------##########------########## \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [062a];[fe95];[fe96];[fe98];
+Bitmap: \
+-------------------------------- \
+----####--####------####--####-- \
+-------------------------------- \
+####--------########--------#### \
+####--------########--------#### \
+--############----############-- \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0646];[fee5];[fee6];[fee8];
+Bitmap: \
+-------------------------------- \
+------####------------####------ \
+-------------------------------- \
+----##------##------##------##-- \
+--####------####--####------#### \
+--####------####--####------#### \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [0645];[fee1];[fee2];[fee4];
+Bitmap: \
+-------------------------------- \
+----------####------------####-- \
+------##########------########## \
+----########--##----########--## \
+--####----######--####----###### \
+--####------####--####------#### \
+--####------------####---------- \
+--####------------####----------
+%
+Unicode: [062c];[fe9d];[fe9e];[fea0];
+Bitmap: \
+-------------------------------- \
+--########--------########------ \
+--------####------------####---- \
+----##########------##########-- \
+--####------####--####------#### \
+--####------------####---------- \
+--####------####--####------#### \
+----######----------######------
+%
+Unicode: [062e];[fea5];[fea6];[fea8];
+Bitmap: \
+------------####------------#### \
+--########--------########------ \
+--------####------------####---- \
+----##########------##########-- \
+--####------####--####------#### \
+--####--------##--####--------## \
+--####------------####---------- \
+----########--------########----
+%
+Unicode: [062d];[fea1];[fea2];[fea4];
+Bitmap: \
+-------------------------------- \
+--########--------########------ \
+--------####------------####---- \
+----##########------##########-- \
+--####------####--####------#### \
+--####--------##--####--------## \
+--####------------####---------- \
+----########--------########----
+%
+Unicode: [0636];[febd];[febe];[fec0];
+Bitmap: \
+--------####------------####---- \
+-------------------------------- \
+--------########--------######## \
+##----####----####----####----## \
+##----##------####----##------## \
+##----############----########## \
+##########------##########------ \
+--######----------######--------
+%
+Unicode: [0642];[fed5];[fed6];[fed8];
+Bitmap: \
+----####--####------####--####-- \
+-------------------------------- \
+----------######----------###### \
+--##----####--##--##----####--## \
+####------##########------###### \
+####--------########--------#### \
+--############----############-- \
+--------------------------------
+%
+Unicode: [0633];[feb1];[feb2];[feb4];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+##----##--##--####----##--##--## \
+##----##--##--####----##--##--## \
+##----############----########## \
+##----########--##----########-- \
+########--------########-------- \
+--####------------####----------
+%
+Unicode: [0641];[fed1];[fed2];[fed4];
+Bitmap: \
+-------------------------------- \
+----####------------####-------- \
+----------######----------###### \
+####----####--######----####--## \
+####------##########------###### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0639];[fec9];[feca];[fecc];
+Bitmap: \
+-------------------------------- \
+--------######----------######-- \
+------####------------####------ \
+------####------------####------ \
+----############----############ \
+--####--------##--####--------## \
+--######----------######-------- \
+----##########------##########--
+%
+Unicode: [0643];[fed9];[feda];[fedc];
+Bitmap: \
+------------####------------#### \
+----####----####----####----#### \
+----##------####----##------#### \
+--######----####--######----#### \
+------------####------------#### \
+##----------######----------#### \
+##############--##############-- \
+--------------------------------
+%
+Unicode: [0635];[feb9];[feba];[febc];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------########--------######## \
+##----####----####----####----## \
+##----##------####----##------## \
+##----############----########## \
+########--------########-------- \
+--####------------####----------
+%
+Unicode: [063a];[fecd];[fece];[fed0];
+Bitmap: \
+--####------------####---------- \
+--------######----------######-- \
+------####------------####------ \
+------####------------####------ \
+----############----############ \
+--####--------##--####--------## \
+--######----------######-------- \
+----##########------##########--
+%
+Unicode: [0649];[feef];[fef0];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------######----------######-- \
+####--####--########--####--#### \
+####--####----######--####----## \
+####----####--######----####--## \
+####----####----####----####---- \
+--##########------##########----
+%
+Unicode: [0632];[feaf];[feb0];
+Bitmap: \
+-------------------------------- \
+------------####------------#### \
+-------------------------------- \
+----------####------------####-- \
+------------####------------#### \
+------------####------------#### \
+----------####------------####-- \
+--##########------##########----
+%
+Unicode: [feb7];
+Bitmap: \
+------####------------####------ \
+--####----####----####----####-- \
+-------------------------------- \
+--##----##----##--##----##----## \
+####--####--########--####--#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [062f];[fea9];[feaa];[0631];[fead];[feae];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+----------####------------####-- \
+------------####------------#### \
+------------####------------#### \
+----------####------------####-- \
+--##########------##########----
+%
+Unicode: [0630];[feab];[feac];
+Bitmap: \
+----####------------####-------- \
+-------------------------------- \
+--------####------------####---- \
+----------####------------####-- \
+------------####------------#### \
+------------####------------#### \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [fef3];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+----####--####------####--####--
+%
+Unicode: [fe9b];
+Bitmap: \
+------####------------####------ \
+--####----####----####----####-- \
+-------------------------------- \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fe91];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+----------####------------####--
+%
+Unicode: [fedf];
+Bitmap: \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0627];[fe8d];[fe8e];
+Bitmap: \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+------------####------------#### \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [feeb];
+Bitmap: \
+-------------------------------- \
+------##--------------##-------- \
+----##########------##########-- \
+----##----######----##----###### \
+----######----##----######----## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fe97];
+Bitmap: \
+-------------------------------- \
+--####--####------####--####---- \
+-------------------------------- \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fee7];
+Bitmap: \
+-------------------------------- \
+--------####------------####---- \
+-------------------------------- \
+------------####------------#### \
+------------####------------#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fee3];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+----------######----------###### \
+--------####--##--------####--## \
+############--##############--## \
+----------######----------###### \
+--------------------------------
+%
+Unicode: [fe9f];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--########--------########------ \
+--##----####------##----####---- \
+----------####------------####-- \
+################################ \
+-------------------------------- \
+--------####------------####----
+%
+Unicode: [fef7];[f3f8];
+Bitmap: \
+------------####------------#### \
+----##------####----##------#### \
+----####----####----####----#### \
+------####--####------####--#### \
+--------##--####--------##--#### \
+--------######----------######-- \
+--##########------##########---- \
+--------------------------------
+%
+Unicode: [fea7];
+Bitmap: \
+----####------------####-------- \
+-------------------------------- \
+--########--------########------ \
+--##----####------##----####---- \
+----------####------------####-- \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fea3];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--########--------########------ \
+--##----####------##----####---- \
+----------####------------####-- \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [febf];
+Bitmap: \
+------####------------####------ \
+-------------------------------- \
+--------########--------######## \
+--##--####----##--##--####----## \
+########------##########------## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fed7];
+Bitmap: \
+--####--####------####--####---- \
+-------------------------------- \
+------##########------########## \
+------####----##------####----## \
+--------########--------######## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [feb3];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+-------------------------------- \
+--##----##----##--##----##----## \
+####--####--########--####--#### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fed3];
+Bitmap: \
+----####------------####-------- \
+-------------------------------- \
+--------########--------######## \
+--------####--##--------####--## \
+----------######----------###### \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fecb];
+Bitmap: \
+-------------------------------- \
+------######----------######---- \
+----##########------##########-- \
+----####------------####-------- \
+------####------------####------ \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fedb];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+------######----------######---- \
+----------####------------####-- \
+------------####------------#### \
+------------####------------#### \
+----##########------##########-- \
+--------------------------------
+%
+Unicode: [febb];
+Bitmap: \
+-------------------------------- \
+-------------------------------- \
+--------########--------######## \
+--##--####----##--##--####----## \
+########------##########------## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0637];[fec1];[fec2];[fec4];[fec3];
+Bitmap: \
+--####------------####---------- \
+--####------------####---------- \
+--####--########--####--######## \
+--########----##--########----## \
+--######------##--######------## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [fecf];
+Bitmap: \
+--####------------####---------- \
+------######----------######---- \
+----##########------##########-- \
+----####------------####-------- \
+------####------------####------ \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [0638];[fec5];[fec6];[fec8];[fec7];
+Bitmap: \
+--####--####------####--####---- \
+--####------------####---------- \
+--####--########--####--######## \
+--########----##--########----## \
+--######------##--######------## \
+################################ \
+-------------------------------- \
+--------------------------------
+%
+Unicode: [061f];
+Bitmap: \
+-------------------------------- \
+----########--------########---- \
+--####----####----####----####-- \
+----####------------####-------- \
+------####------------####------ \
+-------------------------------- \
+------####------------####------ \
+--------------------------------
+%
+// dotted-box (no such glyph)
+Unicode: [0000];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####--######-- \
+ --####--######-- \
+ --##------------ \
+ --##------------ \
+ ------------##-- \
+ ------------##-- \
+ --##------------ \
+ --##------------ \
+ ------------##-- \
+ ------------##-- \
+ --######--####-- \
+ --######--####-- \
+ ----------------
+ ----------------
+%
+// backtick
+Unicode: [0060];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####-------- \
+ ----####-------- \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// curlies
+Unicode: [007b];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --------####---- \
+ --------####---- \
+ ----------------
+ ----------------
+%
+Unicode: [007d];
+Bitmap: \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ----####-------- \
+ ----####-------- \
+ ----------------
+ ----------------
+%
+// tilde
+Unicode: [007e];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --######----#### \
+ --######----#### \
+ ####--####--#### \
+ ####--####--#### \
+ ####----######-- \
+ ####----######-- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// euro
+Unicode: [20ac];
+Bitmap: \
+ ------########-- \
+ ------########-- \
+ ----####-------- \
+ ----####-------- \
+ --##########---- \
+ --##########---- \
+ ----####-------- \
+ ----####-------- \
+ --##########---- \
+ --##########---- \
+ ----####-------- \
+ ----####-------- \
+ ------########-- \
+ ------########-- \
+ ----------------
+ ----------------
+%
+// spanish left-quote
+Unicode: [00ab];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ ####----####---- \
+ ####----####---- \
+ --####----####-- \
+ --####----####-- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// spanish right-quote
+Unicode: [00bb];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ####----####---- \
+ ####----####---- \
+ --####----####-- \
+ --####----####-- \
+ ####----####---- \
+ ####----####---- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// spanish inverted question mark
+Unicode: [00bf];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ --------####---- \
+ --------####---- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+// copyright
+Unicode: [00a9];
+Bitmap: \
+ --##########---- \
+ --##########---- \
+ ##----------##-- \
+ ##----------##-- \
+ ##----####--##-- \
+ ##----####--##-- \
+ ##--##------##-- \
+ ##--##------##-- \
+ ##----####--##-- \
+ ##----####--##-- \
+ ##----------##-- \
+ ##----------##-- \
+ --##########---- \
+ --##########---- \
+ ----------------
+ ----------------
+%
+// registered
+Unicode: [00ae];
+Bitmap: \
+ --##########---- \
+ --##########---- \
+ ##----------##-- \
+ ##----------##-- \
+ ##--####----##-- \
+ ##--####----##-- \
+ ##--##--##--##-- \
+ ##--##--##--##-- \
+ ##--####----##-- \
+ ##--####----##-- \
+ ##--##--##--##-- \
+ ##--##--##--##-- \
+ --##########---- \
+ --##########---- \
+ ----------------
+ ----------------
+%
+// degrees
+Unicode: [00b0];[00ba];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ----##----##---- \
+ ----##----##---- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// cents
+Unicode: [00a2];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ----##########-- \
+ ----##########-- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ ----##########-- \
+ ----##########-- \
+ ------####------ \
+ ------####------ \
+ ----------------
+ ----------------
+%
+// "currency sign"
+// FIXME: not bold enough
+Unicode: [00a4];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --##--------##-- \
+ --##--------##-- \
+ ----########---- \
+ ----########---- \
+ ----##----##---- \
+ ----##----##---- \
+ ----##----##---- \
+ ----##----##---- \
+ ----########---- \
+ ----########---- \
+ --##--------##-- \
+ --##--------##-- \
+ ----------------
+ ----------------
+%
+// yen
+Unicode: [00a5];
+Bitmap: \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ----------------
+ ----------------
+%
+// broken bar
+Unicode: [00a6];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ----------------
+ ----------------
+%
+// section sign
+// FIXME: not bold enough
+Unicode: [00a7];
+Bitmap: \
+ ------######---- \
+ ------######---- \
+ ----##---------- \
+ ----##---------- \
+ ------####------ \
+ ------####------ \
+ ----##----##---- \
+ ----##----##---- \
+ ------####------ \
+ ------####------ \
+ ----------##---- \
+ ----------##---- \
+ ----######------ \
+ ----######------ \
+ ----------------
+ ----------------
+%
+// diaresis (cha, cha, cha!)
+Unicode: [00a8];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// feminine ordinal (superscript a)
+Unicode: [00aa];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --------######-- \
+ --------######-- \
+ ----####--####-- \
+ ----####--####-- \
+ ------########-- \
+ ------########-- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// "not" sign
+Unicode: [00ac];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ ----------####-- \
+ ----------####-- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// macron
+Unicode: [00af];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// plus-minus
+Unicode: [00b1];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// superscript 2
+// FIXME: not bold enough
+Unicode: [00b2];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####-------- \
+ ----####-------- \
+ --##----##------ \
+ --##----##------ \
+ ------##-------- \
+ ------##-------- \
+ ----##---------- \
+ ----##---------- \
+ --########------ \
+ --########------ \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// FIXME: not bold enough
+// superscript 3
+Unicode: [00b3];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####-------- \
+ ----####-------- \
+ --##----##------ \
+ --##----##------ \
+ ------##-------- \
+ ------##-------- \
+ --##----##------ \
+ --##----##------ \
+ ----####-------- \
+ ----####-------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// acute
+Unicode: [00b4];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// mu
+Unicode: [00b5];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----##########-- \
+ ----##########-- \
+ ----------####-- \
+ ----------####-- \
+ ----------------
+ ----------------
+%
+// paragraph
+Unicode: [00b6];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####--####-- \
+ ----####--####-- \
+ --######--####-- \
+ --######--####-- \
+ --######--####-- \
+ --######--####-- \
+ ----####--####-- \
+ ----####--####-- \
+ ------##--####-- \
+ ------##--####-- \
+ ------##--####-- \
+ ------##--####-- \
+ ----------------
+ ----------------
+%
+// middle dot
+Unicode: [00b7];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// superscript 1
+Unicode: [00b9];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ----######------ \
+ ----######------ \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+// FIXME: MISSING fractions, 00bc/00bd/00bc, ¼ ½ ¾, hard to do in 8x8
+%
+// A with grave
+Unicode: [00c0];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####----####-- \
+ --####----####-- \
+ ----------------
+ ----------------
+%
+// A with acute
+Unicode: [00c1];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####----####-- \
+ --####----####-- \
+ ----------------
+ ----------------
+%
+// A with circumflex
+Unicode: [00c2];
+Bitmap: \
+ ----########---- \
+ ----########---- \
+ --##--------##-- \
+ --##--------##-- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####----####-- \
+ --####----####-- \
+ ----------------
+ ----------------
+%
+// A with tilde
+Unicode: [00c3];
+Bitmap: \
+ ----####--####-- \
+ ----####--####-- \
+ --####--####---- \
+ --####--####---- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####----####-- \
+ --####----####-- \
+ ----------------
+ ----------------
+%
+// A with ring
+Unicode: [00c5];
+Bitmap: \
+ ------####------ \
+ ------####------ \
+ ----##----##---- \
+ ----##----##---- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####----####-- \
+ --####----####-- \
+ ----------------
+ ----------------
+%
+// AE ligature
+Unicode: [00c6];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----##########-- \
+ ----##########-- \
+ --########------ \
+ --########------ \
+ ####--####------ \
+ ####--####------ \
+ ##############-- \
+ ##############-- \
+ ####--####------ \
+ ####--####------ \
+ ####--########-- \
+ ####--########-- \
+ ----------------
+ ----------------
+// FIXME: this is hideous!
+%
+// C with cedilla
+Unicode: [00c7];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --####---------- \
+ --####---------- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ------####------ \
+ ------####------ \
+ ----####--------
+ ----####--------
+%
+// E with circumflex
+Unicode: [00ca];
+Bitmap: \
+ ----########---- \
+ ----########---- \
+ --##--------##-- \
+ --##--------##-- \
+ --############-- \
+ --############-- \
+ --####---------- \
+ --####---------- \
+ --##########---- \
+ --##########---- \
+ --####---------- \
+ --####---------- \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+// FIXME: ugly!
+%
+// E with umlaut
+Unicode: [00cb];
+Bitmap: \
+ ----####--####-- \
+ ----####--####-- \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ --####---------- \
+ --####---------- \
+ --##########---- \
+ --##########---- \
+ --####---------- \
+ --####---------- \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+%
+// I with grave
+Unicode: [00cc];
+Bitmap: \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+%
+// I with acute
+Unicode: [00cd];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+%
+// I with circumflex
+Unicode: [00ce];
+Bitmap: \
+ ----########---- \
+ ----########---- \
+ --##--------##-- \
+ --##--------##-- \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+// FIXME: ugly!
+%
+// I with umlaut
+Unicode: [00cf];
+Bitmap: \
+ ----####--####-- \
+ ----####--####-- \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+%
+// capital eth
+Unicode: [00d0];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --########------ \
+ --########------ \
+ --####--####---- \
+ --####--####---- \
+ --####----####-- \
+ --####----####-- \
+ ########--####-- \
+ ########--####-- \
+ --####--####---- \
+ --####--####---- \
+ --########------ \
+ --########------ \
+ ----------------
+ ----------------
+%
+// O with grave
+Unicode: [00d2];
+Bitmap: \
+ --####---------- \
+ --####---------- \
+ ----########---- \
+ ----########---- \
+ --##--##--####-- \
+ --##--##--####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+// FIXME: MISSING Ô Õ
+%
+// multiplication
+Unicode: [00d7];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+// FIXME: MISSING Ø
+%
+// U with grave
+Unicode: [00d9];
+Bitmap: \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+%
+// U with acute
+Unicode: [00da];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+// FIXME: MISSING Û
+%
+// Y with acute
+Unicode: [00dd];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ----------------
+ ----------------
+%
+// capital thorn
+Unicode: [00de];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####---------- \
+ --####---------- \
+ --##########---- \
+ --##########---- \
+ --####----####-- \
+ --####----####-- \
+ --##########---- \
+ --##########---- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ ----------------
+ ----------------
+%
+// a with circumflex
+Unicode: [00e2];
+Bitmap: \
+ ----########---- \
+ ----########---- \
+ --##--------##-- \
+ --##--------##-- \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --------######-- \
+ --------######-- \
+ ----####--####-- \
+ ----####--####-- \
+ ------########-- \
+ ------########-- \
+ ----------------
+ ----------------
+%
+// a with tilde
+Unicode: [00e3];
+Bitmap: \
+ ----####--####-- \
+ ----####--####-- \
+ --####--####---- \
+ --####--####---- \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --------######-- \
+ --------######-- \
+ ----####--####-- \
+ ----####--####-- \
+ ------########--
+ ------########--
+// FIXME: touches bottom
+%
+// ae ligature
+Unicode: [00e6];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ --######--####-- \
+ --######--####-- \
+ ------####--#### \
+ ------####--#### \
+ --############-- \
+ --############-- \
+ ####--####------ \
+ ####--####------ \
+ --############-- \
+ --############-- \
+ ----------------
+ ----------------
+// FIXME: fugly
+%
+// e with umlaut
+Unicode: [00eb];
+Bitmap: \
+ --####----####-- \
+ --####----####-- \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --############-- \
+ --############-- \
+ --####---------- \
+ --####---------- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+// i with acute
+Unicode: [00ed];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ----######------ \
+ ----######------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ------####------ \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+// lowercase eth
+Unicode: [00f0];
+Bitmap: \
+ --####--##------ \
+ --####--##------ \
+ ----####-------- \
+ ----####-------- \
+ --##--####------ \
+ --##--####------ \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+// o with tilde
+Unicode: [00f5];
+Bitmap: \
+ ----####--####-- \
+ ----####--####-- \
+ --####--####---- \
+ --####--####---- \
+ ---------------- \
+ ---------------- \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+// division
+Unicode: [00f7];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ --############-- \
+ --############-- \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+// FIXME: MISSING ø
+%
+// y with acute
+Unicode: [00fd];
+Bitmap: \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----##########-- \
+ ----##########-- \
+ --------####---- \
+ --------####---- \
+ --########------
+ --########------
+%
+// lowercase thorn
+Unicode: [00fe];
+Bitmap: \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ --########------ \
+ --########------ \
+ --####--####---- \
+ --####--####---- \
+ --########------ \
+ --########------ \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ --####---------- \
+ ----------------
+ ----------------
+%
+// y with umlaut
+Unicode: [00ff];
+Bitmap: \
+ --####----####-- \
+ --####----####-- \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----##########-- \
+ ----##########-- \
+ --------####---- \
+ --------####---- \
+ --########------
+ --########------
+%
+// left single curly quote
+Unicode: [2018];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ --------####---- \
+ --------####---- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// right single curly quote
+Unicode: [2019];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ----####-------- \
+ ----####-------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// left double curly quote
+Unicode: [201c];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ----####----#### \
+ ----####----#### \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// right double curly quote
+Unicode: [201d];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ --####----####-- \
+ ####----####---- \
+ ####----####---- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// spanish left single quote
+Unicode: [2039];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ ----####-------- \
+ ----####-------- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// spanish right single quote
+Unicode: [203a];
+Bitmap: \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ---------------- \
+ ------####------ \
+ ------####------ \
+ --------####---- \
+ --------####---- \
+ ------####------ \
+ ------####------ \
+ ---------------- \
+ ---------------- \
+ ----------------
+ ----------------
+%
+// replacement character for missing glyphs
+Unicode: [fffd];
+Bitmap: \
+ ----########---- \
+ ----########---- \
+ --####----####-- \
+ --####----####-- \
+ --##--####--##-- \
+ --##--####--##-- \
+ --######--####-- \
+ --######--####-- \
+ --############-- \
+ --############-- \
+ --######--####-- \
+ --######--####-- \
+ ----########---- \
+ ----########---- \
+ ----------------
+ ----------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/fonts/fauxtari-24.bdf b/fonts/fauxtari-24.bdf
new file mode 100644
index 0000000..8cb0933
--- /dev/null
+++ b/fonts/fauxtari-24.bdf
@@ -0,0 +1,13325 @@
+STARTFONT 2.1
+FONT -BW-Fauxtari Fixed Mono-Medium-R-Normal--24-240-75-75-C-240-iso10646-1
+SIZE 24 75 75
+FONTBOUNDINGBOX 24 24 0 -6
+STARTPROPERTIES 18
+FOUNDRY "BW"
+FAMILY_NAME "Fauxtari Fixed Mono"
+FACE_NAME "Fauxtari 24"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 24
+POINT_SIZE 240
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 240
+CHARSET_REGISTRY "iso10646"
+CHARSET_ENCODING "1"
+FONT_DESCENT 6
+FONT_ASCENT 18
+DEFAULT_CHAR 0
+ENDPROPERTIES
+CHARS 429
+STARTCHAR C0000
+ENCODING 0
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8ff8
+1f8ff8
+1f8ff8
+1c0000
+1c0000
+1c0000
+000038
+000038
+000038
+1c0000
+1c0000
+1c0000
+000038
+000038
+000038
+1ff1f8
+1ff1f8
+1ff1f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0001
+ENCODING 32
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0002
+ENCODING 33
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0003
+ENCODING 34
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0004
+ENCODING 35
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+ffffff
+ffffff
+ffffff
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+ffffff
+ffffff
+ffffff
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0005
+ENCODING 36
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0006
+ENCODING 37
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f81f8
+1f81f8
+1f81f8
+1c01f8
+1c01f8
+1c01f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0007
+ENCODING 38
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007fc0
+007fc0
+007fc0
+03f1f8
+03f1f8
+03f1f8
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+1f8fff
+1f8fff
+1f8fff
+1f81f8
+1f81f8
+1f81f8
+03fe3f
+03fe3f
+03fe3f
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0008
+ENCODING 39
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0009
+ENCODING 40
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007fc0
+007fc0
+007fc0
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007fc0
+007fc0
+007fc0
+000ff8
+000ff8
+000ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C000a
+ENCODING 41
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ff000
+1ff000
+1ff000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03fe00
+03fe00
+03fe00
+1ff000
+1ff000
+1ff000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C000b
+ENCODING 42
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+ffffff
+ffffff
+ffffff
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C000c
+ENCODING 43
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C000d
+ENCODING 44
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+ENDCHAR
+STARTCHAR C000e
+ENCODING 45
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C000f
+ENCODING 46
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0010
+ENCODING 47
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f8000
+1f8000
+1f8000
+1c0000
+1c0000
+1c0000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0011
+ENCODING 48
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f8ff8
+1f8ff8
+1f8ff8
+1ff1f8
+1ff1f8
+1ff1f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0012
+ENCODING 49
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0013
+ENCODING 50
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0014
+ENCODING 51
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0015
+ENCODING 52
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+007fc0
+007fc0
+007fc0
+03ffc0
+03ffc0
+03ffc0
+1f8fc0
+1f8fc0
+1f8fc0
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0016
+ENCODING 53
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+0001f8
+0001f8
+0001f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0017
+ENCODING 54
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0018
+ENCODING 55
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+0001f8
+0001f8
+0001f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0019
+ENCODING 56
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C001a
+ENCODING 57
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+0001f8
+0001f8
+0001f8
+000fc0
+000fc0
+000fc0
+03fe00
+03fe00
+03fe00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C001b
+ENCODING 58
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C001c
+ENCODING 59
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+ENDCHAR
+STARTCHAR C001d
+ENCODING 60
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+0001f8
+0001f8
+0001f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C001e
+ENCODING 61
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C001f
+ENCODING 62
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0020
+ENCODING 63
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0021
+ENCODING 64
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f8ff8
+1f8ff8
+1f8ff8
+1f8ff8
+1f8ff8
+1f8ff8
+1f8000
+1f8000
+1f8000
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0022
+ENCODING 65
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0023
+ENCODING 66
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0024
+ENCODING 67
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0025
+ENCODING 68
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+1f8fc0
+1f8fc0
+1f8fc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0026
+ENCODING 69
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0027
+ENCODING 70
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0028
+ENCODING 71
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0029
+ENCODING 72
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002a
+ENCODING 73
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002b
+ENCODING 74
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002c
+ENCODING 75
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+1ffe00
+1ffe00
+1ffe00
+1f8fc0
+1f8fc0
+1f8fc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002d
+ENCODING 76
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002e
+ENCODING 77
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f803f
+1f803f
+1f803f
+1ff1ff
+1ff1ff
+1ff1ff
+1fffff
+1fffff
+1fffff
+1f8e3f
+1f8e3f
+1f8e3f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C002f
+ENCODING 78
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0030
+ENCODING 79
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0031
+ENCODING 80
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0032
+ENCODING 81
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0033
+ENCODING 82
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+1f8fc0
+1f8fc0
+1f8fc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0034
+ENCODING 83
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0035
+ENCODING 84
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0036
+ENCODING 85
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0037
+ENCODING 86
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0038
+ENCODING 87
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f8e3f
+1f8e3f
+1f8e3f
+1fffff
+1fffff
+1fffff
+1ff1ff
+1ff1ff
+1ff1ff
+1f803f
+1f803f
+1f803f
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0039
+ENCODING 88
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003a
+ENCODING 89
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003b
+ENCODING 90
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003c
+ENCODING 91
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007ff8
+007ff8
+007ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003d
+ENCODING 92
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1c0000
+1c0000
+1c0000
+1f8000
+1f8000
+1f8000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003e
+ENCODING 93
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffe00
+1ffe00
+1ffe00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C003f
+ENCODING 94
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000e00
+000e00
+000e00
+007fc0
+007fc0
+007fc0
+03f1f8
+03f1f8
+03f1f8
+1f803f
+1f803f
+1f803f
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0040
+ENCODING 95
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0041
+ENCODING 96
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0042
+ENCODING 97
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0043
+ENCODING 98
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0044
+ENCODING 99
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0045
+ENCODING 100
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0046
+ENCODING 101
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0047
+ENCODING 102
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+03fff8
+03fff8
+03fff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0048
+ENCODING 103
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0049
+ENCODING 104
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C004a
+ENCODING 105
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C004b
+ENCODING 106
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C004c
+ENCODING 107
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+1f8fc0
+1f8fc0
+1f8fc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C004d
+ENCODING 108
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C004e
+ENCODING 109
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1fffff
+1fffff
+1fffff
+1fffff
+1fffff
+1fffff
+1f8e3f
+1f8e3f
+1f8e3f
+1f803f
+1f803f
+1f803f
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C004f
+ENCODING 110
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0050
+ENCODING 111
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0051
+ENCODING 112
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0052
+ENCODING 113
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C0053
+ENCODING 114
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0054
+ENCODING 115
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0055
+ENCODING 116
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000ff8
+000ff8
+000ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0056
+ENCODING 117
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0057
+ENCODING 118
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0058
+ENCODING 119
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f803f
+1f803f
+1f803f
+1f8e3f
+1f8e3f
+1f8e3f
+1fffff
+1fffff
+1fffff
+03fff8
+03fff8
+03fff8
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0059
+ENCODING 120
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C005a
+ENCODING 121
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000fc0
+000fc0
+000fc0
+1ffe00
+1ffe00
+1ffe00
+ENDCHAR
+STARTCHAR C005b
+ENCODING 122
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C005c
+ENCODING 123
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C005d
+ENCODING 124
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C005e
+ENCODING 125
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C005f
+ENCODING 126
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ff03f
+1ff03f
+1ff03f
+fc7e3f
+fc7e3f
+fc7e3f
+fc0ff8
+fc0ff8
+fc0ff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0060
+ENCODING 160
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0061
+ENCODING 161
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0062
+ENCODING 162
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+03fff8
+03fff8
+03fff8
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0063
+ENCODING 163
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007fc0
+007fc0
+007fc0
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+1ffe00
+1ffe00
+1ffe00
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0064
+ENCODING 164
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1c0038
+1c0038
+1c0038
+03ffc0
+03ffc0
+03ffc0
+0381c0
+0381c0
+0381c0
+0381c0
+0381c0
+0381c0
+03ffc0
+03ffc0
+03ffc0
+1c0038
+1c0038
+1c0038
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0065
+ENCODING 165
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0066
+ENCODING 166
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0067
+ENCODING 167
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007fc0
+007fc0
+007fc0
+038000
+038000
+038000
+007e00
+007e00
+007e00
+0381c0
+0381c0
+0381c0
+007e00
+007e00
+007e00
+0001c0
+0001c0
+0001c0
+03fe00
+03fe00
+03fe00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0068
+ENCODING 168
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0069
+ENCODING 169
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1fffc0
+1fffc0
+1fffc0
+e00038
+e00038
+e00038
+e07e38
+e07e38
+e07e38
+e38038
+e38038
+e38038
+e07e38
+e07e38
+e07e38
+e00038
+e00038
+e00038
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006a
+ENCODING 170
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+000ff8
+000ff8
+000ff8
+03f1f8
+03f1f8
+03f1f8
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006b
+ENCODING 171
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+fc0fc0
+fc0fc0
+fc0fc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006c
+ENCODING 172
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006d
+ENCODING 173
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006e
+ENCODING 174
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1fffc0
+1fffc0
+1fffc0
+e00038
+e00038
+e00038
+e3f038
+e3f038
+e3f038
+e38e38
+e38e38
+e38e38
+e3f038
+e3f038
+e3f038
+e38e38
+e38e38
+e38e38
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C006f
+ENCODING 175
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0070
+ENCODING 176
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+0381c0
+0381c0
+0381c0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0071
+ENCODING 177
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0072
+ENCODING 178
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+1c0e00
+1c0e00
+1c0e00
+007000
+007000
+007000
+038000
+038000
+038000
+1ffe00
+1ffe00
+1ffe00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0073
+ENCODING 179
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+1c0e00
+1c0e00
+1c0e00
+007000
+007000
+007000
+1c0e00
+1c0e00
+1c0e00
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0074
+ENCODING 180
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0075
+ENCODING 181
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0076
+ENCODING 182
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+03f1f8
+03f1f8
+03f1f8
+0071f8
+0071f8
+0071f8
+0071f8
+0071f8
+0071f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0077
+ENCODING 183
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0078
+ENCODING 184
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+ENDCHAR
+STARTCHAR C0079
+ENCODING 185
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007a
+ENCODING 186
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+0381c0
+0381c0
+0381c0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007b
+ENCODING 187
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fc0fc0
+fc0fc0
+fc0fc0
+1f81f8
+1f81f8
+1f81f8
+fc0fc0
+fc0fc0
+fc0fc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007c
+ENCODING 191
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007d
+ENCODING 192
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007e
+ENCODING 193
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C007f
+ENCODING 194
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1c0038
+1c0038
+1c0038
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0080
+ENCODING 195
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+1f8fc0
+1f8fc0
+1f8fc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0081
+ENCODING 196
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0082
+ENCODING 197
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+0381c0
+0381c0
+0381c0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0083
+ENCODING 198
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03fff8
+03fff8
+03fff8
+1ffe00
+1ffe00
+1ffe00
+fc7e00
+fc7e00
+fc7e00
+fffff8
+fffff8
+fffff8
+fc7e00
+fc7e00
+fc7e00
+fc7ff8
+fc7ff8
+fc7ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0084
+ENCODING 199
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f8000
+1f8000
+1f8000
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+ENDCHAR
+STARTCHAR C0085
+ENCODING 201
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0086
+ENCODING 202
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1c0038
+1c0038
+1c0038
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0087
+ENCODING 203
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0088
+ENCODING 204
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0089
+ENCODING 205
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008a
+ENCODING 206
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1c0038
+1c0038
+1c0038
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008b
+ENCODING 207
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008c
+ENCODING 208
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+1f8fc0
+1f8fc0
+1f8fc0
+1f81f8
+1f81f8
+1f81f8
+fff1f8
+fff1f8
+fff1f8
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008d
+ENCODING 209
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ff1f8
+1ffff8
+1ffff8
+1ffff8
+1f8ff8
+1f8ff8
+1f8ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008e
+ENCODING 210
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+1c71f8
+1c71f8
+1c71f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C008f
+ENCODING 211
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+0001f8
+0001f8
+0001f8
+03ffc0
+03ffc0
+03ffc0
+1f8e38
+1f8e38
+1f8e38
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0090
+ENCODING 214
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0091
+ENCODING 215
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0092
+ENCODING 217
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0093
+ENCODING 218
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0094
+ENCODING 220
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0095
+ENCODING 221
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0096
+ENCODING 222
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1fffc0
+1fffc0
+1fffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0097
+ENCODING 223
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+03f1f8
+03f1f8
+03f1f8
+03ffc0
+03ffc0
+03ffc0
+03f1f8
+03f1f8
+03f1f8
+03f1ff
+03f1ff
+03f1ff
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0098
+ENCODING 224
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0099
+ENCODING 225
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009a
+ENCODING 226
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1c0038
+1c0038
+1c0038
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+000ff8
+000ff8
+000ff8
+03f1f8
+03f1f8
+03f1f8
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009b
+ENCODING 227
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+000ff8
+000ff8
+000ff8
+03f1f8
+03f1f8
+03f1f8
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009c
+ENCODING 228
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009d
+ENCODING 229
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+007fc0
+007fc0
+007fc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009e
+ENCODING 230
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1ff1f8
+1ff1f8
+1ff1f8
+007e3f
+007e3f
+007e3f
+1ffff8
+1ffff8
+1ffff8
+fc7e00
+fc7e00
+fc7e00
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C009f
+ENCODING 231
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+ENDCHAR
+STARTCHAR C00a0
+ENCODING 232
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a1
+ENCODING 233
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a2
+ENCODING 234
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+fc003f
+fc003f
+fc003f
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a3
+ENCODING 235
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a4
+ENCODING 236
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a5
+ENCODING 237
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a6
+ENCODING 238
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a7
+ENCODING 239
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a8
+ENCODING 240
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8e00
+1f8e00
+1f8e00
+03f000
+03f000
+03f000
+1c7e00
+1c7e00
+1c7e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00a9
+ENCODING 241
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00aa
+ENCODING 242
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ab
+ENCODING 243
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ac
+ENCODING 244
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ad
+ENCODING 245
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ae
+ENCODING 246
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00af
+ENCODING 247
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b0
+ENCODING 249
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b1
+ENCODING 250
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b2
+ENCODING 251
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b3
+ENCODING 252
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b4
+ENCODING 253
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000fc0
+000fc0
+000fc0
+1ffe00
+1ffe00
+1ffe00
+ENDCHAR
+STARTCHAR C00b5
+ENCODING 254
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1ffe00
+1ffe00
+1ffe00
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00b6
+ENCODING 255
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000fc0
+000fc0
+000fc0
+1ffe00
+1ffe00
+1ffe00
+ENDCHAR
+STARTCHAR C00b7
+ENCODING 260
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+00003f
+00003f
+00003f
+ENDCHAR
+STARTCHAR C00b8
+ENCODING 261
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+00003f
+00003f
+00003f
+ENDCHAR
+STARTCHAR C00b9
+ENCODING 262
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+03ffc0
+03ffc0
+03ffc0
+1f8ff8
+1f8ff8
+1f8ff8
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ba
+ENCODING 263
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00bb
+ENCODING 280
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00bc
+ENCODING 281
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C00bd
+ENCODING 321
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1ffe00
+1ffe00
+1ffe00
+1ff000
+1ff000
+1ff000
+ff8000
+ff8000
+ff8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00be
+ENCODING 322
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00bf
+ENCODING 323
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+1c7e38
+1c7e38
+1c7e38
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c0
+ENCODING 324
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1fffc0
+1fffc0
+1fffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c1
+ENCODING 346
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c2
+ENCODING 347
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03fff8
+03fff8
+03fff8
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c3
+ENCODING 377
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+03f1f8
+03f1f8
+03f1f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c4
+ENCODING 378
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c5
+ENCODING 379
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c6
+ENCODING 380
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c7
+ENCODING 551
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+0001f8
+0001f8
+0001f8
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c8
+ENCODING 1488
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fc01f8
+fc01f8
+fc01f8
+fff1f8
+fff1f8
+fff1f8
+fc7ff8
+fc7ff8
+fc7ff8
+fc0fc0
+fc0fc0
+fc0fc0
+fc01f8
+fc01f8
+fc01f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00c9
+ENCODING 1489
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fffe00
+fffe00
+fffe00
+007fc0
+007fc0
+007fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ca
+ENCODING 1490
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+1fffc0
+1fffc0
+1fffc0
+ff81f8
+ff81f8
+ff81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00cb
+ENCODING 1491
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fffff8
+fffff8
+fffff8
+007fc0
+007fc0
+007fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00cc
+ENCODING 1492
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+0001f8
+0001f8
+0001f8
+1c01f8
+1c01f8
+1c01f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00cd
+ENCODING 1493
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+007fc0
+007fc0
+007fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ce
+ENCODING 1494
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+1ff000
+1ff000
+1ff000
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00cf
+ENCODING 1495
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d0
+ENCODING 1496
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fc7ff8
+fc7ff8
+fc7ff8
+fc71f8
+fc71f8
+fc71f8
+fc01f8
+fc01f8
+fc01f8
+fc01f8
+fc01f8
+fc01f8
+ffffc0
+ffffc0
+ffffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d1
+ENCODING 1497
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+007fc0
+007fc0
+007fc0
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d2
+ENCODING 1498
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+000ff8
+000ff8
+000ff8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C00d3
+ENCODING 1499
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+000ff8
+000ff8
+000ff8
+ffffc0
+ffffc0
+ffffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d4
+ENCODING 1500
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+fc0000
+fc0000
+fc0000
+ffffc0
+ffffc0
+ffffc0
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+000ff8
+000ff8
+000ff8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d5
+ENCODING 1501
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d6
+ENCODING 1502
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fc7fc0
+fc7fc0
+fc7fc0
+1ff1f8
+1ff1f8
+1ff1f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f8ff8
+1f8ff8
+1f8ff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d7
+ENCODING 1503
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007ff8
+007ff8
+007ff8
+000ff8
+000ff8
+000ff8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C00d8
+ENCODING 1504
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007ff8
+007ff8
+007ff8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+000ff8
+000ff8
+000ff8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00d9
+ENCODING 1505
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fffff8
+fffff8
+fffff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00da
+ENCODING 1506
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ff8ff8
+ff8ff8
+ff8ff8
+1f81f8
+1f81f8
+1f81f8
+03f1f8
+03f1f8
+03f1f8
+03f1f8
+03f1f8
+03f1f8
+ffffc0
+ffffc0
+ffffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00db
+ENCODING 1507
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C00dc
+ENCODING 1508
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+000ff8
+000ff8
+000ff8
+ffffc0
+ffffc0
+ffffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00dd
+ENCODING 1509
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fc0ff8
+fc0ff8
+fc0ff8
+1f81f8
+1f81f8
+1f81f8
+1f8fc0
+1f8fc0
+1f8fc0
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C00de
+ENCODING 1510
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+fc01f8
+fc01f8
+fc01f8
+1f8ff8
+1f8ff8
+1f8ff8
+03fe00
+03fe00
+03fe00
+000fc0
+000fc0
+000fc0
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00df
+ENCODING 1511
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+000ff8
+000ff8
+000ff8
+fc01f8
+fc01f8
+fc01f8
+fc0fc0
+fc0fc0
+fc0fc0
+fc7e00
+fc7e00
+fc7e00
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+ENDCHAR
+STARTCHAR C00e0
+ENCODING 1512
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+000ff8
+000ff8
+000ff8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e1
+ENCODING 1513
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+e07038
+e07038
+e07038
+fc7038
+fc7038
+fc7038
+ff81f8
+ff81f8
+ff81f8
+fc0fc0
+fc0fc0
+fc0fc0
+ffffc0
+ffffc0
+ffffc0
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e2
+ENCODING 1514
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+ffffc0
+ffffc0
+ffffc0
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+ff81f8
+ff81f8
+ff81f8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e3
+ENCODING 1567
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e4
+ENCODING 1569
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+03f000
+03f000
+03f000
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+038000
+038000
+038000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e5
+ENCODING 1570
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C00e6
+ENCODING 1572
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+fc0fff
+fc0fff
+fc0fff
+007e3f
+007e3f
+007e3f
+000fff
+000fff
+000fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C00e7
+ENCODING 1575
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00e8
+ENCODING 1576
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C00e9
+ENCODING 1577
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e3f
+007e3f
+007e3f
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ea
+ENCODING 1578
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00eb
+ENCODING 1579
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00ec
+ENCODING 1580
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f803f
+1f803f
+1f803f
+03fe00
+03fe00
+03fe00
+ENDCHAR
+STARTCHAR C00ed
+ENCODING 1581
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C00ee
+ENCODING 1582
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C00ef
+ENCODING 1583
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C00f0
+ENCODING 1584
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00f1
+ENCODING 1585
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C00f2
+ENCODING 1586
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+00003f
+00003f
+00003f
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C00f3
+ENCODING 1587
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+e07ff8
+e07ff8
+e07ff8
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C00f4
+ENCODING 1588
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+03f03f
+03f03f
+03f03f
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C00f5
+ENCODING 1589
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C00f6
+ENCODING 1590
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fffe00
+fffe00
+fffe00
+1ff000
+1ff000
+1ff000
+ENDCHAR
+STARTCHAR C00f7
+ENCODING 1591
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00f8
+ENCODING 1592
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00f9
+ENCODING 1593
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C00fa
+ENCODING 1594
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C00fb
+ENCODING 1601
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+0001ff
+0001ff
+0001ff
+fc0fc7
+fc0fc7
+fc0fc7
+fc01ff
+fc01ff
+fc01ff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00fc
+ENCODING 1602
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+0001ff
+0001ff
+0001ff
+1c0fc7
+1c0fc7
+1c0fc7
+fc01ff
+fc01ff
+fc01ff
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00fd
+ENCODING 1603
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03f03f
+03f03f
+03f03f
+03803f
+03803f
+03803f
+1ff03f
+1ff03f
+1ff03f
+00003f
+00003f
+00003f
+e0003f
+e0003f
+e0003f
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C00fe
+ENCODING 1604
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C00ff
+ENCODING 1605
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+007fff
+007fff
+007fff
+03ffc7
+03ffc7
+03ffc7
+1f81ff
+1f81ff
+1f81ff
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0100
+ENCODING 1606
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+038038
+038038
+038038
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0101
+ENCODING 1607
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0102
+ENCODING 1608
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0103
+ENCODING 1609
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+fc7e3f
+fc7e3f
+fc7e3f
+fc7e07
+fc7e07
+fc7e07
+fc0fc7
+fc0fc7
+fc0fc7
+fc0fc0
+fc0fc0
+fc0fc0
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0104
+ENCODING 1610
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+e07fff
+e07fff
+e07fff
+e07e07
+e07e07
+e07e07
+fc0fc7
+fc0fc7
+fc0fc7
+1fffc7
+1fffc7
+1fffc7
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+ENDCHAR
+STARTCHAR C0105
+ENCODING 1632
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1f8000
+1f8000
+1f8000
+1c0000
+1c0000
+1c0000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0106
+ENCODING 1633
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000e00
+000e00
+000e00
+007fc0
+007fc0
+007fc0
+03fff8
+03fff8
+03fff8
+007fc0
+007fc0
+007fc0
+000e00
+000e00
+000e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0107
+ENCODING 1634
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0108
+ENCODING 1635
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f8000
+1f8000
+1f8000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C0109
+ENCODING 1636
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8e3f
+1f8e3f
+1f8e3f
+1f8e3f
+1f8e3f
+1f8e3f
+1fffff
+1fffff
+1fffff
+1ff000
+1ff000
+1ff000
+03f000
+03f000
+03f000
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C010a
+ENCODING 1637
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007ff8
+007ff8
+007ff8
+03fe00
+03fe00
+03fe00
+1ff000
+1ff000
+1ff000
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C010b
+ENCODING 1638
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+03fff8
+03fff8
+03fff8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1ffff8
+1ffff8
+1ffff8
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C010c
+ENCODING 1639
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1fffc0
+1fffc0
+1fffc0
+1fffc0
+1fffc0
+1fffc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+000fc0
+ENDCHAR
+STARTCHAR C010d
+ENCODING 1640
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C010e
+ENCODING 1641
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+ENDCHAR
+STARTCHAR C010f
+ENCODING 8211
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0110
+ENCODING 8212
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0111
+ENCODING 8216
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0112
+ENCODING 8217
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0113
+ENCODING 8220
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+03f03f
+03f03f
+03f03f
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0114
+ENCODING 8221
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+1f81f8
+fc0fc0
+fc0fc0
+fc0fc0
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0115
+ENCODING 8249
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0116
+ENCODING 8250
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0117
+ENCODING 8364
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007ff8
+007ff8
+007ff8
+03f000
+03f000
+03f000
+1fffc0
+1fffc0
+1fffc0
+03f000
+03f000
+03f000
+1fffc0
+1fffc0
+1fffc0
+03f000
+03f000
+03f000
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0118
+ENCODING 8592
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03f000
+03f000
+03f000
+1ffff8
+1ffff8
+1ffff8
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0119
+ENCODING 8593
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011a
+ENCODING 8594
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000fc0
+000fc0
+000fc0
+1ffff8
+1ffff8
+1ffff8
+000fc0
+000fc0
+000fc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011b
+ENCODING 8595
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+1ffff8
+1ffff8
+1ffff8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011c
+ENCODING 8624
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffff8
+1ffff8
+1ffff8
+1ffe00
+1ffe00
+1ffe00
+1fffc0
+1fffc0
+1fffc0
+1f8ff8
+1f8ff8
+1f8ff8
+1f81f8
+1f81f8
+1f81f8
+0001f8
+0001f8
+0001f8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011d
+ENCODING 9243
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1ffe00
+1ffe00
+1ffe00
+1f8000
+1f8000
+1f8000
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+007ff8
+007ff8
+007ff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011e
+ENCODING 9473
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C011f
+ENCODING 9475
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ENDCHAR
+STARTCHAR C0120
+ENCODING 9487
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+007fff
+007fff
+007fff
+007fff
+007fff
+007fff
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0121
+ENCODING 9491
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0122
+ENCODING 9495
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007fff
+007fff
+007fff
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0123
+ENCODING 9499
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0124
+ENCODING 9507
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007fff
+007fff
+007fff
+007fff
+007fff
+007fff
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0125
+ENCODING 9515
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+fffe00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0126
+ENCODING 9523
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0127
+ENCODING 9531
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0128
+ENCODING 9547
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0129
+ENCODING 9585
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+0001ff
+0001ff
+0001ff
+000ff8
+000ff8
+000ff8
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+1ff000
+1ff000
+1ff000
+ff8000
+ff8000
+ff8000
+fc0000
+fc0000
+fc0000
+ENDCHAR
+STARTCHAR C012a
+ENCODING 9586
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+fc0000
+fc0000
+fc0000
+ff8000
+ff8000
+ff8000
+1ff000
+1ff000
+1ff000
+03fe00
+03fe00
+03fe00
+007fc0
+007fc0
+007fc0
+000ff8
+000ff8
+000ff8
+0001ff
+0001ff
+0001ff
+00003f
+00003f
+00003f
+ENDCHAR
+STARTCHAR C012b
+ENCODING 9601
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ENDCHAR
+STARTCHAR C012c
+ENCODING 9604
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ENDCHAR
+STARTCHAR C012d
+ENCODING 9612
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+ENDCHAR
+STARTCHAR C012e
+ENCODING 9614
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+fc0000
+ENDCHAR
+STARTCHAR C012f
+ENCODING 9620
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0130
+ENCODING 9622
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+ENDCHAR
+STARTCHAR C0131
+ENCODING 9623
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+ENDCHAR
+STARTCHAR C0132
+ENCODING 9624
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+fff000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0133
+ENCODING 9629
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000fff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0134
+ENCODING 9654
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007000
+007000
+007000
+007e00
+007e00
+007e00
+007fc0
+007fc0
+007fc0
+007ff8
+007ff8
+007ff8
+007fc0
+007fc0
+007fc0
+007e00
+007e00
+007e00
+007000
+007000
+007000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0135
+ENCODING 9664
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000e00
+000e00
+000e00
+007e00
+007e00
+007e00
+03fe00
+03fe00
+03fe00
+1ffe00
+1ffe00
+1ffe00
+03fe00
+03fe00
+03fe00
+007e00
+007e00
+007e00
+000e00
+000e00
+000e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0136
+ENCODING 9670
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+03ffc0
+03ffc0
+03ffc0
+007e00
+007e00
+007e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0137
+ENCODING 9679
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+03ffc0
+03ffc0
+03ffc0
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0138
+ENCODING 9698
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000007
+000007
+000007
+00003f
+00003f
+00003f
+0001ff
+0001ff
+0001ff
+000fff
+000fff
+000fff
+007fff
+007fff
+007fff
+03ffff
+03ffff
+03ffff
+1fffff
+1fffff
+1fffff
+ffffff
+ffffff
+ffffff
+ENDCHAR
+STARTCHAR C0139
+ENCODING 9699
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+e00000
+e00000
+e00000
+fc0000
+fc0000
+fc0000
+ff8000
+ff8000
+ff8000
+fff000
+fff000
+fff000
+fffe00
+fffe00
+fffe00
+ffffc0
+ffffc0
+ffffc0
+fffff8
+fffff8
+fffff8
+ffffff
+ffffff
+ffffff
+ENDCHAR
+STARTCHAR C013a
+ENCODING 9824
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+1ffff8
+007e00
+007e00
+007e00
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C013b
+ENCODING 9827
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+007fc0
+007fc0
+007fc0
+1ff1ff
+1ff1ff
+1ff1ff
+1ff1ff
+1ff1ff
+1ff1ff
+000e00
+000e00
+000e00
+007fc0
+007fc0
+007fc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C013c
+ENCODING 9829
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+1fffff
+1fffff
+1fffff
+1fffff
+1fffff
+1fffff
+03fff8
+03fff8
+03fff8
+007fc0
+007fc0
+007fc0
+000e00
+000e00
+000e00
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C013d
+ENCODING 62456
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03803f
+03803f
+03803f
+03f03f
+03f03f
+03f03f
+007e3f
+007e3f
+007e3f
+000e3f
+000e3f
+000e3f
+000ff8
+000ff8
+000ff8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C013e
+ENCODING 65152
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+03f000
+03f000
+03f000
+007fc0
+007fc0
+007fc0
+03fe00
+03fe00
+03fe00
+038000
+038000
+038000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C013f
+ENCODING 65153
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0140
+ENCODING 65154
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0141
+ENCODING 65157
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+fc0fff
+fc0fff
+fc0fff
+007e3f
+007e3f
+007e3f
+000fff
+000fff
+000fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0142
+ENCODING 65158
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8000
+1f8000
+1f8000
+fc0fff
+fc0fff
+fc0fff
+007e3f
+007e3f
+007e3f
+000fff
+000fff
+000fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0143
+ENCODING 65165
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0144
+ENCODING 65166
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0145
+ENCODING 65167
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0146
+ENCODING 65168
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0147
+ENCODING 65169
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+ENDCHAR
+STARTCHAR C0148
+ENCODING 65170
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+007e00
+007e00
+007e00
+ENDCHAR
+STARTCHAR C0149
+ENCODING 65171
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e3f
+007e3f
+007e3f
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014a
+ENCODING 65172
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e3f
+007e3f
+007e3f
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014b
+ENCODING 65173
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014c
+ENCODING 65174
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014d
+ENCODING 65175
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014e
+ENCODING 65176
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C014f
+ENCODING 65177
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0150
+ENCODING 65178
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0151
+ENCODING 65179
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0152
+ENCODING 65180
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0153
+ENCODING 65181
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f803f
+1f803f
+1f803f
+03fe00
+03fe00
+03fe00
+ENDCHAR
+STARTCHAR C0154
+ENCODING 65182
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f803f
+1f803f
+1f803f
+03fe00
+03fe00
+03fe00
+ENDCHAR
+STARTCHAR C0155
+ENCODING 65183
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+1c0fc0
+1c0fc0
+1c0fc0
+0001f8
+0001f8
+0001f8
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+ENDCHAR
+STARTCHAR C0156
+ENCODING 65184
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f803f
+1f803f
+1f803f
+03fe00
+03fe00
+03fe00
+ENDCHAR
+STARTCHAR C0157
+ENCODING 65185
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C0158
+ENCODING 65186
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C0159
+ENCODING 65187
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+1c0fc0
+1c0fc0
+1c0fc0
+0001f8
+0001f8
+0001f8
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C015a
+ENCODING 65188
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C015b
+ENCODING 65189
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C015c
+ENCODING 65190
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C015d
+ENCODING 65191
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+000000
+000000
+000000
+1ffe00
+1ffe00
+1ffe00
+1c0fc0
+1c0fc0
+1c0fc0
+0001f8
+0001f8
+0001f8
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C015e
+ENCODING 65192
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+1ffe00
+1ffe00
+1ffe00
+000fc0
+000fc0
+000fc0
+03fff8
+03fff8
+03fff8
+1f803f
+1f803f
+1f803f
+1f8007
+1f8007
+1f8007
+1f8000
+1f8000
+1f8000
+03ffc0
+03ffc0
+03ffc0
+ENDCHAR
+STARTCHAR C015f
+ENCODING 65193
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0160
+ENCODING 65194
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0161
+ENCODING 65195
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0162
+ENCODING 65196
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0163
+ENCODING 65197
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0164
+ENCODING 65198
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0165
+ENCODING 65199
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+00003f
+00003f
+00003f
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0166
+ENCODING 65200
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+00003f
+00003f
+00003f
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C0167
+ENCODING 65201
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+e07ff8
+e07ff8
+e07ff8
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0168
+ENCODING 65202
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+e07ff8
+e07ff8
+e07ff8
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0169
+ENCODING 65203
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+1c0e07
+1c0e07
+1c0e07
+fc7e3f
+fc7e3f
+fc7e3f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C016a
+ENCODING 65204
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+e07ff8
+e07ff8
+e07ff8
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C016b
+ENCODING 65205
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+03f03f
+03f03f
+03f03f
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C016c
+ENCODING 65206
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+03f03f
+03f03f
+03f03f
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C016d
+ENCODING 65207
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+1f81f8
+1f81f8
+1f81f8
+000000
+000000
+000000
+1c0e07
+1c0e07
+1c0e07
+fc7e3f
+fc7e3f
+fc7e3f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C016e
+ENCODING 65208
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+03f03f
+03f03f
+03f03f
+000000
+000000
+000000
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e071c7
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C016f
+ENCODING 65209
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0170
+ENCODING 65210
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0171
+ENCODING 65211
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+1c7e07
+1c7e07
+1c7e07
+fff007
+fff007
+fff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0172
+ENCODING 65212
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fff000
+fff000
+fff000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0173
+ENCODING 65213
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fffe00
+fffe00
+fffe00
+1ff000
+1ff000
+1ff000
+ENDCHAR
+STARTCHAR C0174
+ENCODING 65214
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fffe00
+fffe00
+fffe00
+1ff000
+1ff000
+1ff000
+ENDCHAR
+STARTCHAR C0175
+ENCODING 65215
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+007e00
+007e00
+007e00
+000000
+000000
+000000
+000fff
+000fff
+000fff
+1c7e07
+1c7e07
+1c7e07
+fff007
+fff007
+fff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0176
+ENCODING 65216
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+000fff
+000fff
+000fff
+e07e07
+e07e07
+e07e07
+e07007
+e07007
+e07007
+e07fff
+e07fff
+e07fff
+fffe00
+fffe00
+fffe00
+1ff000
+1ff000
+1ff000
+ENDCHAR
+STARTCHAR C0177
+ENCODING 65217
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0178
+ENCODING 65218
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0179
+ENCODING 65219
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017a
+ENCODING 65220
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017b
+ENCODING 65221
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017c
+ENCODING 65222
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017d
+ENCODING 65223
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017e
+ENCODING 65224
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+1f8000
+1f8000
+1f8000
+1f8fff
+1f8fff
+1f8fff
+1ffe07
+1ffe07
+1ffe07
+1ff007
+1ff007
+1ff007
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C017f
+ENCODING 65225
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0180
+ENCODING 65226
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0181
+ENCODING 65227
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+03fff8
+03fff8
+03fff8
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0182
+ENCODING 65228
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0183
+ENCODING 65229
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0184
+ENCODING 65230
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0185
+ENCODING 65231
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+007fc0
+007fc0
+007fc0
+03fff8
+03fff8
+03fff8
+03f000
+03f000
+03f000
+007e00
+007e00
+007e00
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0186
+ENCODING 65232
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8000
+1f8000
+1f8000
+000ff8
+000ff8
+000ff8
+007e00
+007e00
+007e00
+007e00
+007e00
+007e00
+03ffff
+03ffff
+03ffff
+1f8007
+1f8007
+1f8007
+1ff000
+1ff000
+1ff000
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0187
+ENCODING 65233
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+0001ff
+0001ff
+0001ff
+fc0fc7
+fc0fc7
+fc0fc7
+fc01ff
+fc01ff
+fc01ff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0188
+ENCODING 65234
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+0001ff
+0001ff
+0001ff
+fc0fc7
+fc0fc7
+fc0fc7
+fc01ff
+fc01ff
+fc01ff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0189
+ENCODING 65235
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f000
+03f000
+03f000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+000fc7
+000fc7
+000fc7
+0001ff
+0001ff
+0001ff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018a
+ENCODING 65236
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+03f000
+03f000
+03f000
+0001ff
+0001ff
+0001ff
+fc0fc7
+fc0fc7
+fc0fc7
+fc01ff
+fc01ff
+fc01ff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018b
+ENCODING 65237
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+0001ff
+0001ff
+0001ff
+1c0fc7
+1c0fc7
+1c0fc7
+fc01ff
+fc01ff
+fc01ff
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018c
+ENCODING 65238
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+0001ff
+0001ff
+0001ff
+1c0fc7
+1c0fc7
+1c0fc7
+fc01ff
+fc01ff
+fc01ff
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018d
+ENCODING 65239
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+1f8fc0
+1f8fc0
+1f8fc0
+000000
+000000
+000000
+007fff
+007fff
+007fff
+007e07
+007e07
+007e07
+000fff
+000fff
+000fff
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018e
+ENCODING 65240
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03f1f8
+03f1f8
+03f1f8
+000000
+000000
+000000
+0001ff
+0001ff
+0001ff
+1c0fc7
+1c0fc7
+1c0fc7
+fc01ff
+fc01ff
+fc01ff
+fc003f
+fc003f
+fc003f
+1ffff8
+1ffff8
+1ffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C018f
+ENCODING 65241
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03f03f
+03f03f
+03f03f
+03803f
+03803f
+03803f
+1ff03f
+1ff03f
+1ff03f
+00003f
+00003f
+00003f
+e0003f
+e0003f
+e0003f
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0190
+ENCODING 65242
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03f03f
+03f03f
+03f03f
+03803f
+03803f
+03803f
+1ff03f
+1ff03f
+1ff03f
+00003f
+00003f
+00003f
+e0003f
+e0003f
+e0003f
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0191
+ENCODING 65243
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+007fc0
+007fc0
+007fc0
+0001f8
+0001f8
+0001f8
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0192
+ENCODING 65244
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03f03f
+03f03f
+03f03f
+03803f
+03803f
+03803f
+1ff03f
+1ff03f
+1ff03f
+00003f
+00003f
+00003f
+e0003f
+e0003f
+e0003f
+fffff8
+fffff8
+fffff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0193
+ENCODING 65245
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0194
+ENCODING 65246
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0195
+ENCODING 65247
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C0196
+ENCODING 65248
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+ENDCHAR
+STARTCHAR C0197
+ENCODING 65249
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+007fff
+007fff
+007fff
+03ffc7
+03ffc7
+03ffc7
+1f81ff
+1f81ff
+1f81ff
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0198
+ENCODING 65250
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+007fff
+007fff
+007fff
+03ffc7
+03ffc7
+03ffc7
+1f81ff
+1f81ff
+1f81ff
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C0199
+ENCODING 65251
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+0001ff
+0001ff
+0001ff
+000fc7
+000fc7
+000fc7
+ffffc7
+ffffc7
+ffffc7
+0001ff
+0001ff
+0001ff
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C019a
+ENCODING 65252
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+0001f8
+0001f8
+0001f8
+007fff
+007fff
+007fff
+03ffc7
+03ffc7
+03ffc7
+1f81ff
+1f81ff
+1f81ff
+1f803f
+1f803f
+1f803f
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+1f8000
+ENDCHAR
+STARTCHAR C019b
+ENCODING 65253
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+038038
+038038
+038038
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C019c
+ENCODING 65254
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+038038
+038038
+038038
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C019d
+ENCODING 65255
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000fc0
+000fc0
+000fc0
+000000
+000000
+000000
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C019e
+ENCODING 65256
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007e00
+007e00
+007e00
+000000
+000000
+000000
+038038
+038038
+038038
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+1f803f
+03fff8
+03fff8
+03fff8
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C019f
+ENCODING 65257
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C01a0
+ENCODING 65258
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C01a1
+ENCODING 65259
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+007000
+007000
+007000
+03fff8
+03fff8
+03fff8
+0381ff
+0381ff
+0381ff
+03fe07
+03fe07
+03fe07
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C01a2
+ENCODING 65260
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+000000
+000000
+000000
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C01a3
+ENCODING 65261
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C01a4
+ENCODING 65262
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000fff
+000fff
+000fff
+007e3f
+007e3f
+007e3f
+007fff
+007fff
+007fff
+00003f
+00003f
+00003f
+0001f8
+0001f8
+0001f8
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C01a5
+ENCODING 65263
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+fc7e3f
+fc7e3f
+fc7e3f
+fc7e07
+fc7e07
+fc7e07
+fc0fc7
+fc0fc7
+fc0fc7
+fc0fc0
+fc0fc0
+fc0fc0
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C01a6
+ENCODING 65264
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+fc7e3f
+fc7e3f
+fc7e3f
+fc7e07
+fc7e07
+fc7e07
+fc0fc7
+fc0fc7
+fc0fc7
+fc0fc0
+fc0fc0
+fc0fc0
+1fffc0
+1fffc0
+1fffc0
+ENDCHAR
+STARTCHAR C01a7
+ENCODING 65265
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+e07fff
+e07fff
+e07fff
+e07e07
+e07e07
+e07e07
+fc0fc7
+fc0fc7
+fc0fc7
+1fffc7
+1fffc7
+1fffc7
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+ENDCHAR
+STARTCHAR C01a8
+ENCODING 65266
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+e07fff
+e07fff
+e07fff
+e07e07
+e07e07
+e07e07
+fc0fc7
+fc0fc7
+fc0fc7
+1fffc7
+1fffc7
+1fffc7
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+ENDCHAR
+STARTCHAR C01a9
+ENCODING 65267
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+00003f
+00003f
+00003f
+00003f
+00003f
+00003f
+ffffff
+ffffff
+ffffff
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+ENDCHAR
+STARTCHAR C01aa
+ENCODING 65268
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+000000
+000000
+000000
+000ff8
+000ff8
+000ff8
+e07fff
+e07fff
+e07fff
+e07e07
+e07e07
+e07e07
+fc0fc7
+fc0fc7
+fc0fc7
+1fffc7
+1fffc7
+1fffc7
+000000
+000000
+000000
+03f1f8
+03f1f8
+03f1f8
+ENDCHAR
+STARTCHAR C01ab
+ENCODING 65271
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+00003f
+00003f
+00003f
+03803f
+03803f
+03803f
+03f03f
+03f03f
+03f03f
+007e3f
+007e3f
+007e3f
+000e3f
+000e3f
+000e3f
+000ff8
+000ff8
+000ff8
+1fffc0
+1fffc0
+1fffc0
+000000
+000000
+000000
+ENDCHAR
+STARTCHAR C01ac
+ENCODING 65533
+SWIDTH 666 0
+DWIDTH 24 0
+BBX 24 24 0 -6
+BITMAP
+03ffc0
+03ffc0
+03ffc0
+1f81f8
+1f81f8
+1f81f8
+1c7e38
+1c7e38
+1c7e38
+1ff1f8
+1ff1f8
+1ff1f8
+1ffff8
+1ffff8
+1ffff8
+1ff1f8
+1ff1f8
+1ff1f8
+03ffc0
+03ffc0
+03ffc0
+000000
+000000
+000000
+ENDCHAR
+ENDFONT
diff --git a/fonts/fauxtari-24.psf b/fonts/fauxtari-24.psf
new file mode 100644
index 0000000..901df8d
--- /dev/null
+++ b/fonts/fauxtari-24.psf
Binary files differ
diff --git a/fonts/fauxtari-24.txt b/fonts/fauxtari-24.txt
new file mode 100644
index 0000000..e667ba8
--- /dev/null
+++ b/fonts/fauxtari-24.txt
@@ -0,0 +1,5331 @@
+%PSF2
+Version: 0
+Flags: 1
+Length: 512
+Width: 24
+Height: 24
+%
+Unicode: [2665];
+Bitmap: \
+------------------------------------------------------------------------ \
+------######---######---------######---######---------######---######--- \
+---#####################---#####################---##################### \
+---#####################---#####################---##################### \
+------###############---------###############---------###############--- \
+---------#########---------------#########---------------#########------ \
+------------###---------------------###---------------------###--------- \
+------------------------------------------------------------------------
+%
+Unicode: [2523];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------###############---------###############---------############### \
+---------###############---------###############---------############### \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [2503];
+Bitmap: \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------######
+%
+Unicode: [251b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+###############---------###############---------###############--------- \
+###############---------###############---------###############--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [252b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+###############---------###############---------###############--------- \
+###############---------###############---------###############--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [2513];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+###############---------###############---------###############--------- \
+###############---------###############---------###############--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [2571];
+Bitmap: \
+------------------######------------------######------------------###### \
+---------------#########---------------#########---------------######### \
+------------#########---------------#########---------------#########--- \
+---------#########---------------#########---------------#########------ \
+------#########---------------#########---------------#########--------- \
+---#########---------------#########---------------#########------------ \
+#########---------------#########---------------#########--------------- \
+######------------------######------------------######------------------
+%
+Unicode: [2572];
+Bitmap: \
+######------------------######------------------######------------------ \
+#########---------------#########---------------#########--------------- \
+---#########---------------#########---------------#########------------ \
+------#########---------------#########---------------#########--------- \
+---------#########---------------#########---------------#########------ \
+------------#########---------------#########---------------#########--- \
+---------------#########---------------#########---------------######### \
+------------------######------------------######------------------######
+%
+Unicode: [25e2];
+Bitmap: \
+---------------------###---------------------###---------------------### \
+------------------######------------------######------------------###### \
+---------------#########---------------#########---------------######### \
+------------############------------############------------############ \
+---------###############---------###############---------############### \
+------##################------##################------################## \
+---#####################---#####################---##################### \
+########################################################################
+%
+Unicode: [2597];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+------------############------------############------------############ \
+------------############------------############------------############ \
+------------############------------############------------############
+%
+Unicode: [25e3];
+Bitmap: \
+###---------------------###---------------------###--------------------- \
+######------------------######------------------######------------------ \
+#########---------------#########---------------#########--------------- \
+############------------############------------############------------ \
+###############---------###############---------###############--------- \
+##################------##################------##################------ \
+#####################---#####################---#####################--- \
+########################################################################
+%
+Unicode: [259d];
+Bitmap: \
+------------############------------############------------############ \
+------------############------------############------------############ \
+------------############------------############------------############ \
+------------############------------############------------############ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [2598];
+Bitmap: \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [2594];
+Bitmap: \
+######################################################################## \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [2581];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######################################################################## \
+########################################################################
+%
+Unicode: [2596];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------
+%
+Unicode: [2663];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+---------#########---------------#########---------------#########------ \
+---#########---#########---#########---#########---#########---######### \
+---#########---#########---#########---#########---#########---######### \
+------------###---------------------###---------------------###--------- \
+---------#########---------------#########---------------#########------ \
+------------------------------------------------------------------------
+%
+Unicode: [250f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------###############---------###############---------############### \
+---------###############---------###############---------############### \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [2501];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######################################################################## \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [254b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+######################################################################## \
+######################################################################## \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [25cf];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [2584];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######################################################################## \
+######################################################################## \
+######################################################################## \
+########################################################################
+%
+Unicode: [258e];
+Bitmap: \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------
+%
+Unicode: [2533];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######################################################################## \
+######################################################################## \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [253b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+######################################################################## \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [258c];
+Bitmap: \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------ \
+############------------############------------############------------
+%
+Unicode: [2517];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------###############---------###############---------############### \
+---------###############---------###############---------############### \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0118];[241b];
+Bitmap: \
+---############------------############------------############--------- \
+---######------------------######------------------######--------------- \
+---############------------############------------############--------- \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------############------------############------------############--- \
+------------------------------------------------------------------------
+%
+Unicode: [2191];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [2193];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [2190];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [2192];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0020];[00a0];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0021];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0022];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0023];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+######################################################################## \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+######################################################################## \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0024];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------###############---------###############---------###############--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0025];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------######------######------######------######------######--- \
+---###---------######------###---------######------###---------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0026];
+Bitmap: \
+---------#########---------------#########---------------#########------ \
+------######---######---------######---######---------######---######--- \
+---------#########---------------#########---------------#########------ \
+------#########---------------#########---------------#########--------- \
+---######---############---######---############---######---############ \
+---######------######------######------######------######------######--- \
+------#########---######------#########---######------#########---###### \
+------------------------------------------------------------------------
+%
+Unicode: [0027];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0028];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------#########---------------#########---------------#########--- \
+---------#########---------------#########---------------#########------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------#########---------------#########---------------#########------ \
+------------#########---------------#########---------------#########--- \
+------------------------------------------------------------------------
+%
+Unicode: [0029];
+Bitmap: \
+------------------------------------------------------------------------ \
+---#########---------------#########---------------#########------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------#########---------------#########---------------#########--------- \
+---#########---------------#########---------------#########------------ \
+------------------------------------------------------------------------
+%
+Unicode: [002a];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+######################################################################## \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [002b];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [002c];[00b8];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------
+%
+Unicode: [002d];[00ad];[2013];[2014];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [002e];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [002f];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------------------######------------------######--------------- \
+---###---------------------###---------------------###------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0030];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######---#########------######---#########------######---#########--- \
+---#########---######------#########---######------#########---######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0031];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0032];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0033];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0034];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------######------------------######------------------######------ \
+---------#########---------------#########---------------#########------ \
+------############------------############------------############------ \
+---######---######---------######---######---------######---######------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------
+%
+Unicode: [0035];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---------------######------------------######------------------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0036];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0037];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---------------######------------------######------------------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+------######------------------######------------------######------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0038];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0039];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+---------------######------------------######------------------######--- \
+------------######------------------######------------------######------ \
+------#########---------------#########---------------#########--------- \
+------------------------------------------------------------------------
+%
+Unicode: [003a];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [003b];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------
+%
+Unicode: [003c];
+Bitmap: \
+---------------######------------------######------------------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---------------######------------------######------------------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [003d];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [003e];
+Bitmap: \
+---######------------------######------------------######--------------- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------------------######------------------######--------------- \
+------------------------------------------------------------------------
+%
+Unicode: [003f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0040];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######---#########------######---#########------######---#########--- \
+---######---#########------######---#########------######---#########--- \
+---######------------------######------------------######--------------- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0041];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0042];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0043];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0044];
+Bitmap: \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+---######---######---------######---######---------######---######------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+---############------------############------------############--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0045];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0046];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------------------------------------------------------------------------
+%
+Unicode: [0047];
+Bitmap: \
+------------------------------------------------------------------------ \
+------###############---------###############---------###############--- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0048];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0049];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [004a];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [004b];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+---############------------############------------############--------- \
+---############------------############------------############--------- \
+---######---######---------######---######---------######---######------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [004c];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [004d];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######---------######---######---------######---######---------###### \
+---#########---#########---#########---#########---#########---######### \
+---#####################---#####################---##################### \
+---######---###---######---######---###---######---######---###---###### \
+---######---------######---######---------######---######---------###### \
+---######---------######---######---------######---######---------###### \
+------------------------------------------------------------------------
+%
+Unicode: [004e];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---#########---######------#########---######------#########---######--- \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [004f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0050];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------------------------------------------------------------------------
+%
+Unicode: [0051];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+------######---######---------######---######---------######---######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0052];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+---######---######---------######---######---------######---######------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0053];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0054];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0055];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0056];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0057];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######---------######---######---------######---######---------###### \
+---######---------######---######---------######---######---------###### \
+---######---###---######---######---###---######---######---###---###### \
+---#####################---#####################---##################### \
+---#########---#########---#########---#########---#########---######### \
+---######---------######---######---------######---######---------###### \
+------------------------------------------------------------------------
+%
+Unicode: [0058];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0059];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [005a];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [005b];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------############------------############------------############--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------############------------############------------############--- \
+------------------------------------------------------------------------
+%
+Unicode: [005c];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###---------------------###---------------------###------------------ \
+---######------------------######------------------######--------------- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---------------######------------------######------------------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [005d];
+Bitmap: \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---############------------############------------############--------- \
+------------------------------------------------------------------------
+%
+Unicode: [005e];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------###---------------------###---------------------###--------- \
+---------#########---------------#########---------------#########------ \
+------######---######---------######---######---------######---######--- \
+---######---------######---######---------######---######---------###### \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [005f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######################################################################## \
+------------------------------------------------------------------------
+%
+Unicode: [25c6];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0061];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0062];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0063];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0064];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0065];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0066];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------#########---------------#########---------------#########--- \
+---------######------------------######------------------######--------- \
+------###############---------###############---------###############--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0067];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------
+%
+Unicode: [0068];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0069];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [006a];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------############------------############------------############------
+%
+Unicode: [006b];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######---######---------######---######---------######---######------ \
+---############------------############------------############--------- \
+---######---######---------######---######---------######---######------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [006c];
+Bitmap: \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [006d];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---#####################---#####################---##################### \
+---#####################---#####################---##################### \
+---######---###---######---######---###---######---######---###---###### \
+---######---------######---######---------######---######---------###### \
+------------------------------------------------------------------------
+%
+Unicode: [006e];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [006f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0070];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---###############---------###############---------###############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######---------------
+%
+Unicode: [0071];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######---
+%
+Unicode: [0072];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------------------------------------------------------------------------
+%
+Unicode: [0073];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------###############---------###############---------###############--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0074];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------#########---------------#########---------------#########--- \
+------------------------------------------------------------------------
+%
+Unicode: [0075];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0076];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0077];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######---------######---######---------######---######---------###### \
+---######---###---######---######---###---######---######---###---###### \
+---#####################---#####################---##################### \
+------###############---------###############---------###############--- \
+------######---######---------######---######---------######---######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0078];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0079];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------######------------------######------------------######------ \
+---############------------############------------############---------
+%
+Unicode: [007a];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [2660];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [007c];[0622];[fe81];[fe82];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [21b0];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---############------------############------------############--------- \
+---###############---------###############---------###############------ \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+---------------######------------------######------------------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [25c0];
+Bitmap: \
+------------###---------------------###---------------------###--------- \
+---------######------------------######------------------######--------- \
+------#########---------------#########---------------#########--------- \
+---############------------############------------############--------- \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+------------###---------------------###---------------------###--------- \
+------------------------------------------------------------------------
+%
+Unicode: [25b6];
+Bitmap: \
+---------###---------------------###---------------------###------------ \
+---------######------------------######------------------######--------- \
+---------#########---------------#########---------------#########------ \
+---------############------------############------------############--- \
+---------#########---------------#########---------------#########------ \
+---------######------------------######------------------######--------- \
+---------###---------------------###---------------------###------------ \
+------------------------------------------------------------------------
+%
+Unicode: [00e1];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00f9];
+Bitmap: \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00d1];
+Bitmap: \
+------######---######---------######---######---------######---######--- \
+---######---######---------######---######---------######---######------ \
+------------------------------------------------------------------------ \
+---#########---######------#########---######------#########---######--- \
+---#########---######------#########---######------#########---######--- \
+---##################------##################------##################--- \
+---######---#########------######---#########------######---#########--- \
+------------------------------------------------------------------------
+%
+Unicode: [00c9];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+---###############---------###############---------###############------ \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [00e7];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------
+%
+Unicode: [00f4];
+Bitmap: \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00f2];
+Bitmap: \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00ec];
+Bitmap: \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00a3];
+Bitmap: \
+---------#########---------------#########---------------#########------ \
+------######------------------######------------------######------------ \
+------######------------------######------------------######------------ \
+---############------------############------------############--------- \
+------######------------------######------------------######------------ \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [00ef];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00fc];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00e4];
+Bitmap: \
+------######---######---------######---######---------######---######--- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00d6];
+Bitmap: \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00fa];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00f3];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00f6];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00dc];
+Bitmap: \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [00e5];
+Bitmap: \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---------#########---------------#########---------------#########------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00fb];
+Bitmap: \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00ee];
+Bitmap: \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00e9];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00e8];
+Bitmap: \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [00f1];
+Bitmap: \
+------######---######---------######---######---------######---######--- \
+---######---######---------######---######---------######---######------ \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [00ea];
+Bitmap: \
+------############------------############------------############------ \
+######------------############------------############------------###### \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0227];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00e0];
+Bitmap: \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [00a1];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+Unicode: [00c4];
+Bitmap: \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [05d0];
+Bitmap: \
+------------------------------------------------------------------------ \
+######---------######---######---------######---######---------######--- \
+############---######---############---######---############---######--- \
+######---############---######---############---######---############--- \
+######------######------######------######------######------######------ \
+######---------######---######---------######---######---------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d1];
+Bitmap: \
+------------------------------------------------------------------------ \
+###############---------###############---------###############--------- \
+---------#########---------------#########---------------#########------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+#####################---#####################---#####################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d2];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+---###############---------###############---------###############------ \
+#########------######---#########------######---#########------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d3];
+Bitmap: \
+------------------------------------------------------------------------ \
+#####################---#####################---#####################--- \
+---------#########---------------#########---------------#########------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d4];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---------------######------------------######------------------######--- \
+---###---------######------###---------######------###---------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d5];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---------#########---------------#########---------------#########------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d6];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---#########---------------#########---------------#########------------ \
+------######------------------######------------------######------------ \
+------######------------------######------------------######------------ \
+------######------------------######------------------######------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d7];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d8];
+Bitmap: \
+------------------------------------------------------------------------ \
+######---############---######---############---######---############--- \
+######---###---######---######---###---######---######---###---######--- \
+######---------######---######---------######---######---------######--- \
+######---------######---######---------######---######---------######--- \
+##################------##################------##################------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05d9];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---------#########---------------#########---------------#########------ \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05da];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+------------#########---------------#########---------------#########--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######---
+%
+Unicode: [05db];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------------#########---------------#########---------------#########--- \
+##################------##################------##################------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05dc];
+Bitmap: \
+######------------------######------------------######------------------ \
+##################------##################------##################------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------------#########---------------#########---------------#########--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05dd];
+Bitmap: \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05de];
+Bitmap: \
+------------------------------------------------------------------------ \
+######---#########------######---#########------######---#########------ \
+---#########---######------#########---######------#########---######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######---#########------######---#########------######---#########--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05df];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------############------------############------------############--- \
+------------#########---------------#########---------------#########--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######---
+%
+Unicode: [05e0];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------############------------############------------############--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------------#########---------------#########---------------#########--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e1];
+Bitmap: \
+------------------------------------------------------------------------ \
+#####################---#####################---#####################--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+---############------------############------------############--------- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e2];
+Bitmap: \
+------------------------------------------------------------------------ \
+#########---#########---#########---#########---#########---#########--- \
+---######------######------######------######------######------######--- \
+------######---######---------######---######---------######---######--- \
+------######---######---------######---######---------######---######--- \
+##################------##################------##################------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e3];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######---
+%
+Unicode: [05e4];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------#########---------------#########---------------#########--- \
+##################------##################------##################------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e5];
+Bitmap: \
+------------------------------------------------------------------------ \
+######------#########---######------#########---######------#########--- \
+---######------######------######------######------######------######--- \
+---######---######---------######---######---------######---######------ \
+---############------------############------------############--------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######---------------
+%
+Unicode: [05e6];
+Bitmap: \
+------------------------------------------------------------------------ \
+######---------######---######---------######---######---------######--- \
+---######---#########------######---#########------######---#########--- \
+------#########---------------#########---------------#########--------- \
+------------######------------------######------------------######------ \
+#####################---#####################---#####################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e7];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+------------#########---------------#########---------------#########--- \
+######---------######---######---------######---######---------######--- \
+######------######------######------######------######------######------ \
+######---######---------######---######---------######---######--------- \
+######------------------######------------------######------------------ \
+######------------------######------------------######------------------
+%
+Unicode: [05e8];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+------------#########---------------#########---------------#########--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05e9];
+Bitmap: \
+------------------------------------------------------------------------ \
+###------###------###---###------###------###---###------###------###--- \
+######---###------###---######---###------###---######---###------###--- \
+#########------######---#########------######---#########------######--- \
+######------######------######------######------######------######------ \
+##################------##################------##################------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [05ea];
+Bitmap: \
+------------------------------------------------------------------------ \
+##################------##################------##################------ \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+#########------######---#########------######---#########------######--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0179];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------######---######---------######---######---------######---######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0105];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------######------------------######------------------######
+%
+Unicode: [017a];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0107];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [015a];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+---------------######------------------######------------------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0119];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######---
+%
+Unicode: [00df];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+------######---######---------######---######---------######---######--- \
+------############------------############------------############------ \
+------######---######---------######---######---------######---######--- \
+------######---#########------######---#########------######---######### \
+------###############---------###############---------###############--- \
+---######------------------######------------------######---------------
+%
+Unicode: [0141];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---############------------############------------############--------- \
+---#########---------------#########---------------#########------------ \
+#########---------------#########---------------#########--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0142];
+Bitmap: \
+------------------------------------------------------------------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+---------#########---------------#########---------------#########------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0143];
+Bitmap: \
+------------######------------------######------------------######------ \
+---###---######---###------###---######---###------###---######---###--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---##################------##################------##################--- \
+---######---#########------######---#########------######---#########--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [0144];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+---###############---------###############---------###############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------
+%
+Unicode: [00d3];
+Bitmap: \
+---------------######------------------######------------------######--- \
+------############------------############------------############------ \
+---######---###---###------######---###---###------######---###---###--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------------------------------------------------------------------------
+%
+Unicode: [015b];
+Bitmap: \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------###############---------###############---------###############--- \
+---######------------------######------------------######--------------- \
+------############------------############------------############------ \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------
+%
+Unicode: [0106];
+Bitmap: \
+------------######------------------######------------------######------ \
+------############------------############------------############------ \
+---######---#########------######---#########------######---#########--- \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######------######------######------######------######------######--- \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0104];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+---######------######------######------######------######------######--- \
+------------------######------------------######------------------######
+%
+Unicode: [017b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------------------######------------------######--------------- \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [017c];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---##################------##################------##################--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0660];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+------------######------------------######------------------######------ \
+---------######------------------######------------------######--------- \
+------######------------------######------------------######------------ \
+---######------------------######------------------######--------------- \
+---###---------------------###---------------------###------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0661];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------###---------------------###---------------------###--------- \
+---------#########---------------#########---------------#########------ \
+------###############---------###############---------###############--- \
+---------#########---------------#########---------------#########------ \
+------------###---------------------###---------------------###--------- \
+------------------------------------------------------------------------
+%
+Unicode: [0662];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [0663];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------------------######------------------######--------------- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------######------------------######------------------######------ \
+---------------######------------------######------------------######---
+%
+Unicode: [0664];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######---###---######---######---###---######---######---###---###### \
+---######---###---######---######---###---######---######---###---###### \
+---#####################---#####################---##################### \
+---#########---------------#########---------------#########------------ \
+------######------------------######------------------######------------ \
+------#########---------------#########---------------#########--------- \
+---------######------------------######------------------######---------
+%
+Unicode: [0665];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------############------------############------------############--- \
+------#########---------------#########---------------#########--------- \
+---#########---------------#########---------------#########------------ \
+---------#########---------------#########---------------#########------ \
+------#########---------------#########---------------#########--------- \
+---#########---------------#########---------------#########------------ \
+------###############---------###############---------###############---
+%
+Unicode: [0666];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+------###############---------###############---------###############--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---##################------##################------##################--- \
+------############------------############------------############------
+%
+Unicode: [0667];
+Bitmap: \
+------------------------------------------------------------------------ \
+---###############---------###############---------###############------ \
+---###############---------###############---------###############------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------ \
+------------######------------------######------------------######------
+%
+Unicode: [0668];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+------############------------############------------############------ \
+------############------------############------------############------ \
+---------######------------------######------------------######---------
+%
+Unicode: [0669];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------############------------############------------############------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######--- \
+---######------######------######------######------######------######---
+%
+Unicode: [0624];[fe85];[fe86];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######------------------######------------------######--------------- \
+######------##################------##################------############ \
+---------######---######---------######---######---------######---###### \
+------------############------------############------------############ \
+------------------######------------------######------------------###### \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------
+%
+Unicode: [0634];[feb5];[feb6];[feb8];
+Bitmap: \
+------------######------------------######------------------######------ \
+------######------######------######------######------######------###### \
+------------------------------------------------------------------------ \
+###------###---###---######------###---###---######------###---###---### \
+###------###---###---######------###---###---######------###---###---### \
+###------##################------##################------############### \
+############------------############------------############------------ \
+---######------------------######------------------######---------------
+%
+Unicode: [0648];[feed];[feee];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+---------######---######---------######---######---------######---###### \
+---------###############---------###############---------############### \
+------------------######------------------######------------------###### \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------
+%
+Unicode: [0629];[fe93];[fe94];
+Bitmap: \
+---------######---######---------######---######---------######---###### \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+---------######---######---------######---######---------######---###### \
+---------######---######---------######---######---------######---###### \
+---------###############---------###############---------############### \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [064a];[fef1];[fef2];[fef4];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------#########---------------#########---------------#########--- \
+###------##################------##################------############### \
+###------######------######------######------######------######------### \
+######------######---#########------######---#########------######---### \
+---###############---###---###############---###---###############---### \
+------------------------------------------------------------------------ \
+------######---######---------######---######---------######---######---
+%
+Unicode: [062b];[fe99];[fe9a];[fe9c];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+######------------############------------############------------###### \
+######------------############------------############------------###### \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0628];[fe8f];[fe90];[fe92];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+######------------############------------############------------###### \
+######------------############------------############------------###### \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######---------
+%
+Unicode: [0644];[fedd];[fede];[fee0];
+Bitmap: \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+---######---------######---######---------######---######---------###### \
+---######---------######---######---------######---######---------###### \
+---######---------######---######---------######---######---------###### \
+------###############---------###############---------###############---
+%
+Unicode: [0621];[fe80];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+------######------------------######------------------######------------ \
+---------#########---------------#########---------------#########------ \
+------#########---------------#########---------------#########--------- \
+------###---------------------###---------------------###--------------- \
+------------------------------------------------------------------------
+%
+Unicode: [0647];[fee9];[feea];[feec];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+---------######---######---------######---######---------######---###### \
+---------######---######---------######---######---------######---###### \
+---------###############---------###############---------############### \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [062a];[fe95];[fe96];[fe98];
+Bitmap: \
+------------------------------------------------------------------------ \
+------######---######---------######---######---------######---######--- \
+------------------------------------------------------------------------ \
+######------------############------------############------------###### \
+######------------############------------############------------###### \
+---##################------##################------##################--- \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0646];[fee5];[fee6];[fee8];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------###---------###---------###---------###---------###---------###--- \
+---######---------######---######---------######---######---------###### \
+---######---------######---######---------######---######---------###### \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [0645];[fee1];[fee2];[fee4];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+---------###############---------###############---------############### \
+------############---###------############---###------############---### \
+---######------#########---######------#########---######------######### \
+---######---------######---######---------######---######---------###### \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######---------------
+%
+Unicode: [062c];[fe9d];[fe9e];[fea0];
+Bitmap: \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+------------######------------------######------------------######------ \
+------###############---------###############---------###############--- \
+---######---------######---######---------######---######---------###### \
+---######------------------######------------------######--------------- \
+---######---------######---######---------######---######---------###### \
+------#########---------------#########---------------#########---------
+%
+Unicode: [062e];[fea5];[fea6];[fea8];
+Bitmap: \
+------------------######------------------######------------------###### \
+---############------------############------------############--------- \
+------------######------------------######------------------######------ \
+------###############---------###############---------###############--- \
+---######---------######---######---------######---######---------###### \
+---######------------###---######------------###---######------------### \
+---######------------------######------------------######--------------- \
+------############------------############------------############------
+%
+Unicode: [062d];[fea1];[fea2];[fea4];
+Bitmap: \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+------------######------------------######------------------######------ \
+------###############---------###############---------###############--- \
+---######---------######---######---------######---######---------###### \
+---######------------###---######------------###---######------------### \
+---######------------------######------------------######--------------- \
+------############------------############------------############------
+%
+Unicode: [0636];[febd];[febe];[fec0];
+Bitmap: \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+###------######------######------######------######------######------### \
+###------###---------######------###---------######------###---------### \
+###------##################------##################------############### \
+###############---------###############---------###############--------- \
+---#########---------------#########---------------#########------------
+%
+Unicode: [0642];[fed5];[fed6];[fed8];
+Bitmap: \
+------######---######---------######---######---------######---######--- \
+------------------------------------------------------------------------ \
+---------------#########---------------#########---------------######### \
+---###------######---###---###------######---###---###------######---### \
+######---------###############---------###############---------######### \
+######------------############------------############------------###### \
+---##################------##################------##################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0633];[feb1];[feb2];[feb4];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+###------###---###---######------###---###---######------###---###---### \
+###------###---###---######------###---###---######------###---###---### \
+###------##################------##################------############### \
+###------############---###------############---###------############--- \
+############------------############------------############------------ \
+---######------------------######------------------######---------------
+%
+Unicode: [0641];[fed1];[fed2];[fed4];
+Bitmap: \
+------------------------------------------------------------------------ \
+------######------------------######------------------######------------ \
+---------------#########---------------#########---------------######### \
+######------######---#########------######---#########------######---### \
+######---------###############---------###############---------######### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0639];[fec9];[feca];[fecc];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------#########---------------#########---------------#########--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------##################------##################------################## \
+---######------------###---######------------###---######------------### \
+---#########---------------#########---------------#########------------ \
+------###############---------###############---------###############---
+%
+Unicode: [0643];[fed9];[feda];[fedc];
+Bitmap: \
+------------------######------------------######------------------###### \
+------######------######------######------######------######------###### \
+------###---------######------###---------######------###---------###### \
+---#########------######---#########------######---#########------###### \
+------------------######------------------######------------------###### \
+###---------------#########---------------#########---------------###### \
+#####################---#####################---#####################--- \
+------------------------------------------------------------------------
+%
+Unicode: [0635];[feb9];[feba];[febc];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+###------######------######------######------######------######------### \
+###------###---------######------###---------######------###---------### \
+###------##################------##################------############### \
+############------------############------------############------------ \
+---######------------------######------------------######---------------
+%
+Unicode: [063a];[fecd];[fece];[fed0];
+Bitmap: \
+---######------------------######------------------######--------------- \
+------------#########---------------#########---------------#########--- \
+---------######------------------######------------------######--------- \
+---------######------------------######------------------######--------- \
+------##################------##################------################## \
+---######------------###---######------------###---######------------### \
+---#########---------------#########---------------#########------------ \
+------###############---------###############---------###############---
+%
+Unicode: [0649];[feef];[fef0];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------#########---------------#########---------------#########--- \
+######---######---############---######---############---######---###### \
+######---######------#########---######------#########---######------### \
+######------######---#########------######---#########------######---### \
+######------######------######------######------######------######------ \
+---###############---------###############---------###############------
+%
+Unicode: [0632];[feaf];[feb0];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------
+%
+Unicode: [feb7];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+---###------###------###---###------###------###---###------###------### \
+######---######---############---######---############---######---###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [062f];[fea9];[feaa];[0631];[fead];[feae];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######--- \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+---------------######------------------######------------------######--- \
+---###############---------###############---------###############------
+%
+Unicode: [0630];[feab];[feac];
+Bitmap: \
+------######------------------######------------------######------------ \
+------------------------------------------------------------------------ \
+------------######------------------######------------------######------ \
+---------------######------------------######------------------######--- \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [fef3];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------######---######---------######---######---------######---######---
+%
+Unicode: [fe9b];
+Bitmap: \
+---------######------------------######------------------######--------- \
+---######------######------######------######------######------######--- \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fe91];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+---------------######------------------######------------------######---
+%
+Unicode: [fedf];
+Bitmap: \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0627];[fe8d];[fe8e];
+Bitmap: \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [feeb];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------###---------------------###---------------------###------------ \
+------###############---------###############---------###############--- \
+------###------#########------###------#########------###------######### \
+------#########------###------#########------###------#########------### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fe97];
+Bitmap: \
+------------------------------------------------------------------------ \
+---######---######---------######---######---------######---######------ \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fee7];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------######------------------######------------------######------ \
+------------------------------------------------------------------------ \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fee3];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------------#########---------------#########---------------######### \
+------------######---###------------######---###------------######---### \
+##################---#####################---#####################---### \
+---------------#########---------------#########---------------######### \
+------------------------------------------------------------------------
+%
+Unicode: [fe9f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+---###------######---------###------######---------###------######------ \
+---------------######------------------######------------------######--- \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------######------------------######------------------######------
+%
+Unicode: [fef7];[f3f8];
+Bitmap: \
+------------------######------------------######------------------###### \
+------###---------######------###---------######------###---------###### \
+------######------######------######------######------######------###### \
+---------######---######---------######---######---------######---###### \
+------------###---######------------###---######------------###---###### \
+------------#########---------------#########---------------#########--- \
+---###############---------###############---------###############------ \
+------------------------------------------------------------------------
+%
+Unicode: [fea7];
+Bitmap: \
+------######------------------######------------------######------------ \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+---###------######---------###------######---------###------######------ \
+---------------######------------------######------------------######--- \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fea3];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---############------------############------------############--------- \
+---###------######---------###------######---------###------######------ \
+---------------######------------------######------------------######--- \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [febf];
+Bitmap: \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+---###---######------###---###---######------###---###---######------### \
+############---------###############---------###############---------### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fed7];
+Bitmap: \
+---######---######---------######---######---------######---######------ \
+------------------------------------------------------------------------ \
+---------###############---------###############---------############### \
+---------######------###---------######------###---------######------### \
+------------############------------############------------############ \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [feb3];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---###------###------###---###------###------###---###------###------### \
+######---######---############---######---############---######---###### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fed3];
+Bitmap: \
+------######------------------######------------------######------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+------------######---###------------######---###------------######---### \
+---------------#########---------------#########---------------######### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fecb];
+Bitmap: \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+------###############---------###############---------###############--- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fedb];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+---------#########---------------#########---------------#########------ \
+---------------######------------------######------------------######--- \
+------------------######------------------######------------------###### \
+------------------######------------------######------------------###### \
+------###############---------###############---------###############--- \
+------------------------------------------------------------------------
+%
+Unicode: [febb];
+Bitmap: \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------ \
+------------############------------############------------############ \
+---###---######------###---###---######------###---###---######------### \
+############---------###############---------###############---------### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0637];[fec1];[fec2];[fec4];[fec3];
+Bitmap: \
+---######------------------######------------------######--------------- \
+---######------------------######------------------######--------------- \
+---######---############---######---############---######---############ \
+---############------###---############------###---############------### \
+---#########---------###---#########---------###---#########---------### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [fecf];
+Bitmap: \
+---######------------------######------------------######--------------- \
+---------#########---------------#########---------------#########------ \
+------###############---------###############---------###############--- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [0638];[fec5];[fec6];[fec8];[fec7];
+Bitmap: \
+---######---######---------######---######---------######---######------ \
+---######------------------######------------------######--------------- \
+---######---############---######---############---######---############ \
+---############------###---############------###---############------### \
+---#########---------###---#########---------###---#########---------### \
+######################################################################## \
+------------------------------------------------------------------------ \
+------------------------------------------------------------------------
+%
+Unicode: [061f];
+Bitmap: \
+------------------------------------------------------------------------ \
+------############------------############------------############------ \
+---######------######------######------######------######------######--- \
+------######------------------######------------------######------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------ \
+---------######------------------######------------------######--------- \
+------------------------------------------------------------------------
+%
+// dotted-box (no such glyph)
+Unicode: [0000];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######---#########--- \
+ ---######---#########--- \
+ ---######---#########--- \
+ ---###------------------ \
+ ---###------------------ \
+ ---###------------------ \
+ ------------------###--- \
+ ------------------###--- \
+ ------------------###--- \
+ ---###------------------ \
+ ---###------------------ \
+ ---###------------------ \
+ ------------------###--- \
+ ------------------###--- \
+ ------------------###--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// backtick
+Unicode: [0060];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// curlies
+Unicode: [007b];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+Unicode: [007d];
+Bitmap: \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// tilde
+Unicode: [007e];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---#########------###### \
+ ---#########------###### \
+ ---#########------###### \
+ ######---######---###### \
+ ######---######---###### \
+ ######---######---###### \
+ ######------#########--- \
+ ######------#########--- \
+ ######------#########--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// euro
+Unicode: [20ac];
+Bitmap: \
+ ---------############--- \
+ ---------############--- \
+ ---------############--- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------############--- \
+ ---------############--- \
+ ---------############--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// spanish left-quote
+Unicode: [00ab];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ######------######------ \
+ ######------######------ \
+ ######------######------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// spanish right-quote
+Unicode: [00bb];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ######------######------ \
+ ######------######------ \
+ ######------######------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ######------######------ \
+ ######------######------ \
+ ######------######------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// spanish inverted question mark
+Unicode: [00bf];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// copyright
+Unicode: [00a9];
+Bitmap: \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ###---------------###--- \
+ ###---------------###--- \
+ ###---------------###--- \
+ ###------######---###--- \
+ ###------######---###--- \
+ ###------######---###--- \
+ ###---###---------###--- \
+ ###---###---------###--- \
+ ###---###---------###--- \
+ ###------######---###--- \
+ ###------######---###--- \
+ ###------######---###--- \
+ ###---------------###--- \
+ ###---------------###--- \
+ ###---------------###--- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// registered
+Unicode: [00ae];
+Bitmap: \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ###---------------###--- \
+ ###---------------###--- \
+ ###---------------###--- \
+ ###---######------###--- \
+ ###---######------###--- \
+ ###---######------###--- \
+ ###---###---###---###--- \
+ ###---###---###---###--- \
+ ###---###---###---###--- \
+ ###---######------###--- \
+ ###---######------###--- \
+ ###---######------###--- \
+ ###---###---###---###--- \
+ ###---###---###---###--- \
+ ###---###---###---###--- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// degrees
+Unicode: [00b0];[00ba];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// cents
+Unicode: [00a2];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// "currency sign"
+// FIXME: not bold enough
+Unicode: [00a4];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// yen
+Unicode: [00a5];
+Bitmap: \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// broken bar
+Unicode: [00a6];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// section sign
+// FIXME: not bold enough
+Unicode: [00a7];
+Bitmap: \
+ ---------#########------ \
+ ---------#########------ \
+ ---------#########------ \
+ ------###--------------- \
+ ------###--------------- \
+ ------###--------------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------------###------ \
+ ---------------###------ \
+ ---------------###------ \
+ ------#########--------- \
+ ------#########--------- \
+ ------#########--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// diaresis (cha, cha, cha!)
+Unicode: [00a8];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// feminine ordinal (superscript a)
+Unicode: [00aa];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------#########--- \
+ ------------#########--- \
+ ------------#########--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---------############--- \
+ ---------############--- \
+ ---------############--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// "not" sign
+Unicode: [00ac];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------------######--- \
+ ---------------######--- \
+ ---------------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// macron
+Unicode: [00af];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// plus-minus
+Unicode: [00b1];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// superscript 2
+// FIXME: not bold enough
+Unicode: [00b2];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---###------###--------- \
+ ---###------###--------- \
+ ---###------###--------- \
+ ---------###------------ \
+ ---------###------------ \
+ ---------###------------ \
+ ------###--------------- \
+ ------###--------------- \
+ ------###--------------- \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// FIXME: not bold enough
+// superscript 3
+Unicode: [00b3];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---###------###--------- \
+ ---###------###--------- \
+ ---###------###--------- \
+ ---------###------------ \
+ ---------###------------ \
+ ---------###------------ \
+ ---###------###--------- \
+ ---###------###--------- \
+ ---###------###--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// acute
+Unicode: [00b4];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// mu
+Unicode: [00b5];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ---------------######--- \
+ ---------------######--- \
+ ---------------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// paragraph
+Unicode: [00b6];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---------###---######--- \
+ ---------###---######--- \
+ ---------###---######--- \
+ ---------###---######--- \
+ ---------###---######--- \
+ ---------###---######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// middle dot
+Unicode: [00b7];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// superscript 1
+Unicode: [00b9];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------#########--------- \
+ ------#########--------- \
+ ------#########--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: MISSING fractions, 00bc/00bd/00bc, ¼ ½ ¾, hard to do in 8x8
+%
+// A with grave
+Unicode: [00c0];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// A with acute
+Unicode: [00c1];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// A with circumflex
+Unicode: [00c2];
+Bitmap: \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// A with tilde
+Unicode: [00c3];
+Bitmap: \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// A with ring
+Unicode: [00c5];
+Bitmap: \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------###------###------ \
+ ------###------###------ \
+ ------###------###------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// AE ligature
+Unicode: [00c6];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ######---######--------- \
+ ######---######--------- \
+ ######---######--------- \
+ #####################--- \
+ #####################--- \
+ #####################--- \
+ ######---######--------- \
+ ######---######--------- \
+ ######---######--------- \
+ ######---############--- \
+ ######---############--- \
+ ######---############--- \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: this is hideous!
+%
+// C with cedilla
+Unicode: [00c7];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------######------------
+ ------######------------
+ ------######------------
+%
+// E with circumflex
+Unicode: [00ca];
+Bitmap: \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: ugly!
+%
+// E with umlaut
+Unicode: [00cb];
+Bitmap: \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// I with grave
+Unicode: [00cc];
+Bitmap: \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// I with acute
+Unicode: [00cd];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// I with circumflex
+Unicode: [00ce];
+Bitmap: \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: ugly!
+%
+// I with umlaut
+Unicode: [00cf];
+Bitmap: \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// capital eth
+Unicode: [00d0];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ############---######--- \
+ ############---######--- \
+ ############---######--- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// O with grave
+Unicode: [00d2];
+Bitmap: \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###---###---######--- \
+ ---###---###---######--- \
+ ---###---###---######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: MISSING Ô Õ
+%
+// multiplication
+Unicode: [00d7];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: MISSING Ø
+%
+// U with grave
+Unicode: [00d9];
+Bitmap: \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// U with acute
+Unicode: [00da];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: MISSING Û
+%
+// Y with acute
+Unicode: [00dd];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// capital thorn
+Unicode: [00de];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---###############------ \
+ ---###############------ \
+ ---###############------ \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// a with circumflex
+Unicode: [00e2];
+Bitmap: \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---###------------###--- \
+ ---###------------###--- \
+ ---###------------###--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------#########--- \
+ ------------#########--- \
+ ------------#########--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---------############--- \
+ ---------############--- \
+ ---------############--- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// a with tilde
+Unicode: [00e3];
+Bitmap: \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------#########--- \
+ ------------#########--- \
+ ------------#########--- \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---------############---
+ ---------############---
+ ---------############---
+// FIXME: touches bottom
+%
+// ae ligature
+Unicode: [00e6];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---------######---###### \
+ ---------######---###### \
+ ---------######---###### \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ######---######--------- \
+ ######---######--------- \
+ ######---######--------- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: fugly
+%
+// e with umlaut
+Unicode: [00eb];
+Bitmap: \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// i with acute
+Unicode: [00ed];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------#########--------- \
+ ------#########--------- \
+ ------#########--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// lowercase eth
+Unicode: [00f0];
+Bitmap: \
+ ---######---###--------- \
+ ---######---###--------- \
+ ---######---###--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---###---######--------- \
+ ---###---######--------- \
+ ---###---######--------- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// o with tilde
+Unicode: [00f5];
+Bitmap: \
+ ------######---######--- \
+ ------######---######--- \
+ ------######---######--- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// division
+Unicode: [00f7];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+// FIXME: MISSING ø
+%
+// y with acute
+Unicode: [00fd];
+Bitmap: \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---############---------
+ ---############---------
+ ---############---------
+%
+// lowercase thorn
+Unicode: [00fe];
+Bitmap: \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ---######---######------ \
+ ---######---######------ \
+ ---######---######------ \
+ ---############--------- \
+ ---############--------- \
+ ---############--------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ---######--------------- \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// y with umlaut
+Unicode: [00ff];
+Bitmap: \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------###############--- \
+ ------###############--- \
+ ------###############--- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---############---------
+ ---############---------
+ ---############---------
+%
+// left single curly quote
+Unicode: [2018];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// right single curly quote
+Unicode: [2019];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// left double curly quote
+Unicode: [201c];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ------######------###### \
+ ------######------###### \
+ ------######------###### \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// right double curly quote
+Unicode: [201d];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ######------######------ \
+ ######------######------ \
+ ######------######------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// spanish left single quote
+Unicode: [2039];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------######------------ \
+ ------######------------ \
+ ------######------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// spanish right single quote
+Unicode: [203a];
+Bitmap: \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------######------ \
+ ------------######------ \
+ ------------######------ \
+ ---------######--------- \
+ ---------######--------- \
+ ---------######--------- \
+ ------------------------ \
+ ------------------------ \
+ ------------------------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+// replacement character for missing glyphs
+Unicode: [fffd];
+Bitmap: \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ---######------######--- \
+ ---######------######--- \
+ ---######------######--- \
+ ---###---######---###--- \
+ ---###---######---###--- \
+ ---###---######---###--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---##################--- \
+ ---##################--- \
+ ---##################--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ---#########---######--- \
+ ------############------ \
+ ------############------ \
+ ------############------ \
+ ------------------------
+ ------------------------
+ ------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/fonts/fauxtari-8.bdf b/fonts/fauxtari-8.bdf
new file mode 100644
index 0000000..f54470d
--- /dev/null
+++ b/fonts/fauxtari-8.bdf
@@ -0,0 +1,6461 @@
+STARTFONT 2.1
+FONT -BW-Fauxtari Fixed Mono-Medium-R-Normal--8-80-75-75-C-80-iso10646-1
+SIZE 8 75 75
+FONTBOUNDINGBOX 8 8 0 -2
+STARTPROPERTIES 18
+FOUNDRY "BW"
+FAMILY_NAME "Fauxtari Fixed Mono"
+FACE_NAME "Fauxtari 8"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 8
+POINT_SIZE 80
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 80
+CHARSET_REGISTRY "iso10646"
+CHARSET_ENCODING "1"
+FONT_DESCENT 2
+FONT_ASCENT 6
+DEFAULT_CHAR 0
+ENDPROPERTIES
+CHARS 429
+STARTCHAR C0000
+ENCODING 0
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+6e
+40
+02
+40
+02
+76
+00
+ENDCHAR
+STARTCHAR C0001
+ENCODING 32
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0002
+ENCODING 33
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+18
+18
+00
+18
+00
+ENDCHAR
+STARTCHAR C0003
+ENCODING 34
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+66
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0004
+ENCODING 35
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+ff
+66
+66
+ff
+66
+00
+ENDCHAR
+STARTCHAR C0005
+ENCODING 36
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+3e
+60
+3c
+06
+7c
+18
+00
+ENDCHAR
+STARTCHAR C0006
+ENCODING 37
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+6c
+18
+30
+66
+46
+00
+ENDCHAR
+STARTCHAR C0007
+ENCODING 38
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1c
+36
+1c
+38
+6f
+66
+3b
+00
+ENDCHAR
+STARTCHAR C0008
+ENCODING 39
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+18
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0009
+ENCODING 40
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+1c
+18
+18
+1c
+0e
+00
+ENDCHAR
+STARTCHAR C000a
+ENCODING 41
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+70
+38
+18
+18
+38
+70
+00
+ENDCHAR
+STARTCHAR C000b
+ENCODING 42
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+3c
+ff
+3c
+66
+00
+00
+ENDCHAR
+STARTCHAR C000c
+ENCODING 43
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+7e
+18
+18
+00
+00
+ENDCHAR
+STARTCHAR C000d
+ENCODING 44
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+18
+18
+30
+ENDCHAR
+STARTCHAR C000e
+ENCODING 45
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+7e
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C000f
+ENCODING 46
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+18
+18
+00
+ENDCHAR
+STARTCHAR C0010
+ENCODING 47
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+0c
+18
+30
+60
+40
+00
+ENDCHAR
+STARTCHAR C0011
+ENCODING 48
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+6e
+76
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0012
+ENCODING 49
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+38
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C0013
+ENCODING 50
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+0c
+18
+30
+7e
+00
+ENDCHAR
+STARTCHAR C0014
+ENCODING 51
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+0c
+18
+0c
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0015
+ENCODING 52
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0c
+1c
+3c
+6c
+7e
+0c
+00
+ENDCHAR
+STARTCHAR C0016
+ENCODING 53
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+60
+7c
+06
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0017
+ENCODING 54
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+60
+7c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0018
+ENCODING 55
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+06
+0c
+18
+30
+30
+00
+ENDCHAR
+STARTCHAR C0019
+ENCODING 56
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C001a
+ENCODING 57
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+3e
+06
+0c
+38
+00
+ENDCHAR
+STARTCHAR C001b
+ENCODING 58
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+18
+18
+00
+18
+18
+00
+ENDCHAR
+STARTCHAR C001c
+ENCODING 59
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+18
+18
+00
+18
+18
+30
+ENDCHAR
+STARTCHAR C001d
+ENCODING 60
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+06
+0c
+18
+30
+18
+0c
+06
+00
+ENDCHAR
+STARTCHAR C001e
+ENCODING 61
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+7e
+00
+00
+7e
+00
+00
+ENDCHAR
+STARTCHAR C001f
+ENCODING 62
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+30
+18
+0c
+18
+30
+60
+00
+ENDCHAR
+STARTCHAR C0020
+ENCODING 63
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+0c
+18
+00
+18
+00
+ENDCHAR
+STARTCHAR C0021
+ENCODING 64
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+6e
+6e
+60
+3e
+00
+ENDCHAR
+STARTCHAR C0022
+ENCODING 65
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+66
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C0023
+ENCODING 66
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7c
+66
+7c
+66
+66
+7c
+00
+ENDCHAR
+STARTCHAR C0024
+ENCODING 67
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+60
+60
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0025
+ENCODING 68
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+6c
+66
+66
+6c
+78
+00
+ENDCHAR
+STARTCHAR C0026
+ENCODING 69
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+60
+7c
+60
+60
+7e
+00
+ENDCHAR
+STARTCHAR C0027
+ENCODING 70
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+60
+7c
+60
+60
+60
+00
+ENDCHAR
+STARTCHAR C0028
+ENCODING 71
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3e
+60
+60
+6e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C0029
+ENCODING 72
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+7e
+66
+66
+66
+00
+ENDCHAR
+STARTCHAR C002a
+ENCODING 73
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+18
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C002b
+ENCODING 74
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+06
+06
+06
+66
+3c
+00
+ENDCHAR
+STARTCHAR C002c
+ENCODING 75
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+6c
+78
+78
+6c
+66
+00
+ENDCHAR
+STARTCHAR C002d
+ENCODING 76
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+60
+60
+60
+60
+7e
+00
+ENDCHAR
+STARTCHAR C002e
+ENCODING 77
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+63
+77
+7f
+6b
+63
+63
+00
+ENDCHAR
+STARTCHAR C002f
+ENCODING 78
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+76
+7e
+7e
+6e
+66
+00
+ENDCHAR
+STARTCHAR C0030
+ENCODING 79
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+66
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0031
+ENCODING 80
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7c
+66
+66
+7c
+60
+60
+00
+ENDCHAR
+STARTCHAR C0032
+ENCODING 81
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+66
+66
+6c
+36
+00
+ENDCHAR
+STARTCHAR C0033
+ENCODING 82
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7c
+66
+66
+7c
+6c
+66
+00
+ENDCHAR
+STARTCHAR C0034
+ENCODING 83
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+60
+3c
+06
+06
+3c
+00
+ENDCHAR
+STARTCHAR C0035
+ENCODING 84
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+18
+18
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C0036
+ENCODING 85
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+66
+66
+66
+7e
+00
+ENDCHAR
+STARTCHAR C0037
+ENCODING 86
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+66
+66
+3c
+18
+00
+ENDCHAR
+STARTCHAR C0038
+ENCODING 87
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+63
+63
+6b
+7f
+77
+63
+00
+ENDCHAR
+STARTCHAR C0039
+ENCODING 88
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+3c
+3c
+66
+66
+00
+ENDCHAR
+STARTCHAR C003a
+ENCODING 89
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+3c
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C003b
+ENCODING 90
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+0c
+18
+30
+60
+7e
+00
+ENDCHAR
+STARTCHAR C003c
+ENCODING 91
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1e
+18
+18
+18
+18
+1e
+00
+ENDCHAR
+STARTCHAR C003d
+ENCODING 92
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+40
+60
+30
+18
+0c
+06
+00
+ENDCHAR
+STARTCHAR C003e
+ENCODING 93
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+18
+18
+18
+18
+78
+00
+ENDCHAR
+STARTCHAR C003f
+ENCODING 94
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+08
+1c
+36
+63
+00
+00
+00
+ENDCHAR
+STARTCHAR C0040
+ENCODING 95
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+00
+ff
+00
+ENDCHAR
+STARTCHAR C0041
+ENCODING 96
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+30
+18
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0042
+ENCODING 97
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C0043
+ENCODING 98
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+60
+7c
+66
+66
+7c
+00
+ENDCHAR
+STARTCHAR C0044
+ENCODING 99
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+60
+60
+60
+3c
+00
+ENDCHAR
+STARTCHAR C0045
+ENCODING 100
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+06
+3e
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C0046
+ENCODING 101
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+66
+7e
+60
+3c
+00
+ENDCHAR
+STARTCHAR C0047
+ENCODING 102
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+18
+3e
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C0048
+ENCODING 103
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3e
+66
+66
+3e
+06
+7c
+ENDCHAR
+STARTCHAR C0049
+ENCODING 104
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+60
+7c
+66
+66
+66
+00
+ENDCHAR
+STARTCHAR C004a
+ENCODING 105
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+38
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C004b
+ENCODING 106
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+00
+06
+06
+06
+06
+3c
+ENDCHAR
+STARTCHAR C004c
+ENCODING 107
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+60
+6c
+78
+6c
+66
+00
+ENDCHAR
+STARTCHAR C004d
+ENCODING 108
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+38
+18
+18
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C004e
+ENCODING 109
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+7f
+7f
+6b
+63
+00
+ENDCHAR
+STARTCHAR C004f
+ENCODING 110
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+7c
+66
+66
+66
+66
+00
+ENDCHAR
+STARTCHAR C0050
+ENCODING 111
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+66
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0051
+ENCODING 112
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+7c
+66
+66
+7c
+60
+60
+ENDCHAR
+STARTCHAR C0052
+ENCODING 113
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3e
+66
+66
+3e
+06
+06
+ENDCHAR
+STARTCHAR C0053
+ENCODING 114
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+7c
+66
+60
+60
+60
+00
+ENDCHAR
+STARTCHAR C0054
+ENCODING 115
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3e
+60
+3c
+06
+7c
+00
+ENDCHAR
+STARTCHAR C0055
+ENCODING 116
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+7e
+18
+18
+18
+0e
+00
+ENDCHAR
+STARTCHAR C0056
+ENCODING 117
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+66
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C0057
+ENCODING 118
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+66
+66
+3c
+18
+00
+ENDCHAR
+STARTCHAR C0058
+ENCODING 119
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+63
+6b
+7f
+3e
+36
+00
+ENDCHAR
+STARTCHAR C0059
+ENCODING 120
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+3c
+18
+3c
+66
+00
+ENDCHAR
+STARTCHAR C005a
+ENCODING 121
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+66
+66
+3e
+0c
+78
+ENDCHAR
+STARTCHAR C005b
+ENCODING 122
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+7e
+0c
+18
+30
+7e
+00
+ENDCHAR
+STARTCHAR C005c
+ENCODING 123
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+18
+30
+18
+18
+0c
+00
+ENDCHAR
+STARTCHAR C005d
+ENCODING 124
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+18
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR C005e
+ENCODING 125
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+18
+0c
+18
+18
+30
+00
+ENDCHAR
+STARTCHAR C005f
+ENCODING 126
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+73
+db
+ce
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0060
+ENCODING 160
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0061
+ENCODING 161
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+00
+18
+18
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C0062
+ENCODING 162
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3e
+60
+60
+3e
+18
+00
+ENDCHAR
+STARTCHAR C0063
+ENCODING 163
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1c
+30
+30
+78
+30
+30
+7e
+00
+ENDCHAR
+STARTCHAR C0064
+ENCODING 164
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+42
+3c
+24
+24
+3c
+42
+00
+ENDCHAR
+STARTCHAR C0065
+ENCODING 165
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+66
+18
+7e
+18
+7e
+18
+00
+ENDCHAR
+STARTCHAR C0066
+ENCODING 166
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+00
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C0067
+ENCODING 167
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1c
+20
+18
+24
+18
+04
+38
+00
+ENDCHAR
+STARTCHAR C0068
+ENCODING 168
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0069
+ENCODING 169
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+7c
+82
+9a
+a2
+9a
+82
+7c
+00
+ENDCHAR
+STARTCHAR C006a
+ENCODING 170
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+0e
+36
+1e
+00
+00
+00
+ENDCHAR
+STARTCHAR C006b
+ENCODING 171
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+66
+cc
+66
+00
+00
+ENDCHAR
+STARTCHAR C006c
+ENCODING 172
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+7e
+06
+00
+00
+00
+ENDCHAR
+STARTCHAR C006d
+ENCODING 173
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+7e
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C006e
+ENCODING 174
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+7c
+82
+b2
+aa
+b2
+aa
+7c
+00
+ENDCHAR
+STARTCHAR C006f
+ENCODING 175
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0070
+ENCODING 176
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+24
+18
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0071
+ENCODING 177
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+7e
+18
+00
+7e
+00
+00
+ENDCHAR
+STARTCHAR C0072
+ENCODING 178
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+48
+10
+20
+78
+00
+00
+ENDCHAR
+STARTCHAR C0073
+ENCODING 179
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+48
+10
+48
+30
+00
+00
+ENDCHAR
+STARTCHAR C0074
+ENCODING 180
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0c
+18
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0075
+ENCODING 181
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+66
+66
+66
+3e
+06
+00
+ENDCHAR
+STARTCHAR C0076
+ENCODING 182
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+76
+76
+36
+16
+16
+00
+ENDCHAR
+STARTCHAR C0077
+ENCODING 183
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+18
+18
+00
+00
+00
+ENDCHAR
+STARTCHAR C0078
+ENCODING 184
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+18
+18
+30
+ENDCHAR
+STARTCHAR C0079
+ENCODING 185
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+38
+18
+3c
+00
+00
+00
+ENDCHAR
+STARTCHAR C007a
+ENCODING 186
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+24
+18
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C007b
+ENCODING 187
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+cc
+66
+cc
+00
+00
+ENDCHAR
+STARTCHAR C007c
+ENCODING 191
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+18
+0c
+66
+3c
+00
+ENDCHAR
+STARTCHAR C007d
+ENCODING 192
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C007e
+ENCODING 193
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0c
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C007f
+ENCODING 194
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+42
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C0080
+ENCODING 195
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+6c
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C0081
+ENCODING 196
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+66
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C0082
+ENCODING 197
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+24
+18
+3c
+66
+7e
+66
+00
+ENDCHAR
+STARTCHAR C0083
+ENCODING 198
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3e
+78
+d8
+fe
+d8
+de
+00
+ENDCHAR
+STARTCHAR C0084
+ENCODING 199
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+60
+66
+3c
+18
+30
+ENDCHAR
+STARTCHAR C0085
+ENCODING 201
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+7e
+60
+7c
+60
+7e
+00
+ENDCHAR
+STARTCHAR C0086
+ENCODING 202
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+42
+7e
+60
+7c
+60
+7e
+00
+ENDCHAR
+STARTCHAR C0087
+ENCODING 203
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+7e
+60
+7c
+60
+7e
+00
+ENDCHAR
+STARTCHAR C0088
+ENCODING 204
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+7e
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C0089
+ENCODING 205
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+7e
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C008a
+ENCODING 206
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+42
+7e
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C008b
+ENCODING 207
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+7e
+18
+18
+18
+7e
+00
+ENDCHAR
+STARTCHAR C008c
+ENCODING 208
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+6c
+66
+f6
+6c
+78
+00
+ENDCHAR
+STARTCHAR C008d
+ENCODING 209
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+6c
+00
+76
+76
+7e
+6e
+00
+ENDCHAR
+STARTCHAR C008e
+ENCODING 210
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+3c
+56
+66
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C008f
+ENCODING 211
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+06
+3c
+6a
+66
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0090
+ENCODING 214
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+00
+3c
+66
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C0091
+ENCODING 215
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+3c
+18
+3c
+66
+00
+00
+ENDCHAR
+STARTCHAR C0092
+ENCODING 217
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+66
+66
+66
+66
+7e
+00
+ENDCHAR
+STARTCHAR C0093
+ENCODING 218
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+66
+66
+66
+66
+7e
+00
+ENDCHAR
+STARTCHAR C0094
+ENCODING 220
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+00
+66
+66
+66
+66
+7e
+00
+ENDCHAR
+STARTCHAR C0095
+ENCODING 221
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+66
+66
+3c
+18
+18
+00
+ENDCHAR
+STARTCHAR C0096
+ENCODING 222
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+7c
+66
+7c
+60
+60
+00
+ENDCHAR
+STARTCHAR C0097
+ENCODING 223
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1c
+36
+3c
+36
+37
+3e
+60
+ENDCHAR
+STARTCHAR C0098
+ENCODING 224
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+3c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C0099
+ENCODING 225
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+3c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C009a
+ENCODING 226
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+42
+00
+3c
+0e
+36
+1e
+00
+ENDCHAR
+STARTCHAR C009b
+ENCODING 227
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+6c
+00
+3c
+0e
+36
+1e
+00
+ENDCHAR
+STARTCHAR C009c
+ENCODING 228
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+3c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C009d
+ENCODING 229
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+66
+1c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C009e
+ENCODING 230
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+76
+1b
+7e
+d8
+7e
+00
+ENDCHAR
+STARTCHAR C009f
+ENCODING 231
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+60
+60
+3c
+18
+30
+ENDCHAR
+STARTCHAR C00a0
+ENCODING 232
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+3c
+66
+7e
+60
+3c
+00
+ENDCHAR
+STARTCHAR C00a1
+ENCODING 233
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+3c
+66
+7e
+60
+3c
+00
+ENDCHAR
+STARTCHAR C00a2
+ENCODING 234
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+c3
+3c
+66
+7e
+60
+3c
+00
+ENDCHAR
+STARTCHAR C00a3
+ENCODING 235
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+00
+3c
+66
+7e
+60
+3c
+00
+ENDCHAR
+STARTCHAR C00a4
+ENCODING 236
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+00
+38
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C00a5
+ENCODING 237
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+00
+38
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C00a6
+ENCODING 238
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+66
+00
+38
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C00a7
+ENCODING 239
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+00
+38
+18
+18
+3c
+00
+ENDCHAR
+STARTCHAR C00a8
+ENCODING 240
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+68
+30
+58
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00a9
+ENCODING 241
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+6c
+00
+7c
+66
+66
+66
+00
+ENDCHAR
+STARTCHAR C00aa
+ENCODING 242
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+00
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00ab
+ENCODING 243
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+00
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00ac
+ENCODING 244
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+66
+00
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00ad
+ENCODING 245
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+6c
+00
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00ae
+ENCODING 246
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+00
+3c
+66
+66
+3c
+00
+ENDCHAR
+STARTCHAR C00af
+ENCODING 247
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+7e
+00
+18
+00
+00
+ENDCHAR
+STARTCHAR C00b0
+ENCODING 249
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+18
+00
+66
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00b1
+ENCODING 250
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+00
+66
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00b2
+ENCODING 251
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+66
+00
+66
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00b3
+ENCODING 252
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+00
+66
+66
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00b4
+ENCODING 253
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+00
+66
+66
+3e
+0c
+78
+ENDCHAR
+STARTCHAR C00b5
+ENCODING 254
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+78
+6c
+78
+60
+60
+00
+ENDCHAR
+STARTCHAR C00b6
+ENCODING 255
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+66
+00
+66
+66
+66
+3e
+0c
+78
+ENDCHAR
+STARTCHAR C00b7
+ENCODING 260
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+66
+66
+7e
+66
+03
+ENDCHAR
+STARTCHAR C00b8
+ENCODING 261
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+06
+3e
+66
+3e
+03
+ENDCHAR
+STARTCHAR C00b9
+ENCODING 262
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+3c
+6e
+60
+60
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00ba
+ENCODING 263
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+3c
+60
+60
+60
+3c
+00
+ENDCHAR
+STARTCHAR C00bb
+ENCODING 280
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+78
+60
+78
+60
+7e
+18
+1e
+00
+ENDCHAR
+STARTCHAR C00bc
+ENCODING 281
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+66
+7e
+60
+3c
+06
+ENDCHAR
+STARTCHAR C00bd
+ENCODING 321
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+60
+78
+70
+e0
+7e
+00
+ENDCHAR
+STARTCHAR C00be
+ENCODING 322
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+38
+18
+1c
+38
+18
+3c
+00
+ENDCHAR
+STARTCHAR C00bf
+ENCODING 323
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+5a
+66
+7e
+7e
+6e
+66
+00
+ENDCHAR
+STARTCHAR C00c0
+ENCODING 324
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+7c
+66
+66
+66
+66
+00
+ENDCHAR
+STARTCHAR C00c1
+ENCODING 346
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+3c
+60
+3c
+06
+06
+3c
+00
+ENDCHAR
+STARTCHAR C00c2
+ENCODING 347
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+3e
+60
+3c
+06
+7c
+00
+ENDCHAR
+STARTCHAR C00c3
+ENCODING 377
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+7e
+36
+0c
+18
+30
+7e
+00
+ENDCHAR
+STARTCHAR C00c4
+ENCODING 378
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+18
+7e
+0c
+18
+30
+7e
+00
+ENDCHAR
+STARTCHAR C00c5
+ENCODING 379
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+7e
+0c
+18
+30
+60
+7e
+00
+ENDCHAR
+STARTCHAR C00c6
+ENCODING 380
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+00
+7e
+0c
+18
+30
+7e
+00
+ENDCHAR
+STARTCHAR C00c7
+ENCODING 551
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+00
+3c
+06
+3e
+66
+3e
+00
+ENDCHAR
+STARTCHAR C00c8
+ENCODING 1488
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+c6
+f6
+de
+cc
+c6
+00
+00
+ENDCHAR
+STARTCHAR C00c9
+ENCODING 1489
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+f8
+1c
+0c
+0c
+fe
+00
+00
+ENDCHAR
+STARTCHAR C00ca
+ENCODING 1490
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+0c
+0c
+7c
+e6
+00
+00
+ENDCHAR
+STARTCHAR C00cb
+ENCODING 1491
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fe
+1c
+0c
+0c
+0c
+00
+00
+ENDCHAR
+STARTCHAR C00cc
+ENCODING 1492
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+06
+46
+66
+66
+00
+00
+ENDCHAR
+STARTCHAR C00cd
+ENCODING 1493
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+1c
+0c
+0c
+0c
+00
+00
+ENDCHAR
+STARTCHAR C00ce
+ENCODING 1494
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+70
+30
+30
+30
+00
+00
+ENDCHAR
+STARTCHAR C00cf
+ENCODING 1495
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+66
+66
+66
+66
+00
+00
+ENDCHAR
+STARTCHAR C00d0
+ENCODING 1496
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+de
+d6
+c6
+c6
+fc
+00
+00
+ENDCHAR
+STARTCHAR C00d1
+ENCODING 1497
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7c
+1c
+0c
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C00d2
+ENCODING 1498
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+0e
+06
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR C00d3
+ENCODING 1499
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+06
+06
+0e
+fc
+00
+00
+ENDCHAR
+STARTCHAR C00d4
+ENCODING 1500
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+c0
+fc
+06
+06
+0e
+3c
+00
+00
+ENDCHAR
+STARTCHAR C00d5
+ENCODING 1501
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+66
+66
+66
+7e
+00
+00
+ENDCHAR
+STARTCHAR C00d6
+ENCODING 1502
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+dc
+76
+66
+66
+6e
+00
+00
+ENDCHAR
+STARTCHAR C00d7
+ENCODING 1503
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1e
+0e
+06
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR C00d8
+ENCODING 1504
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1e
+06
+06
+0e
+7c
+00
+00
+ENDCHAR
+STARTCHAR C00d9
+ENCODING 1505
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fe
+66
+66
+6c
+78
+00
+00
+ENDCHAR
+STARTCHAR C00da
+ENCODING 1506
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+ee
+66
+36
+36
+fc
+00
+00
+ENDCHAR
+STARTCHAR C00db
+ENCODING 1507
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+6e
+66
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR C00dc
+ENCODING 1508
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+66
+66
+0e
+fc
+00
+00
+ENDCHAR
+STARTCHAR C00dd
+ENCODING 1509
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+ce
+66
+6c
+78
+60
+60
+60
+ENDCHAR
+STARTCHAR C00de
+ENCODING 1510
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+c6
+6e
+38
+0c
+fe
+00
+00
+ENDCHAR
+STARTCHAR C00df
+ENCODING 1511
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+0e
+c6
+cc
+d8
+c0
+c0
+ENDCHAR
+STARTCHAR C00e0
+ENCODING 1512
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+0e
+06
+06
+06
+00
+00
+ENDCHAR
+STARTCHAR C00e1
+ENCODING 1513
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+92
+d2
+e6
+cc
+fc
+00
+00
+ENDCHAR
+STARTCHAR C00e2
+ENCODING 1514
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+fc
+6e
+66
+66
+e6
+00
+00
+ENDCHAR
+STARTCHAR C00e3
+ENCODING 1567
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+30
+18
+00
+18
+00
+ENDCHAR
+STARTCHAR C00e4
+ENCODING 1569
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+1c
+30
+1c
+38
+20
+00
+ENDCHAR
+STARTCHAR C00e5
+ENCODING 1570
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+18
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR C00e6
+ENCODING 1572
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+cf
+1b
+0f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C00e7
+ENCODING 1575
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+03
+03
+00
+00
+ENDCHAR
+STARTCHAR C00e8
+ENCODING 1576
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+c3
+c3
+7e
+00
+18
+ENDCHAR
+STARTCHAR C00e9
+ENCODING 1577
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1b
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C00ea
+ENCODING 1578
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C00eb
+ENCODING 1579
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C00ec
+ENCODING 1580
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+60
+63
+38
+ENDCHAR
+STARTCHAR C00ed
+ENCODING 1581
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C00ee
+ENCODING 1582
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C00ef
+ENCODING 1583
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C00f0
+ENCODING 1584
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+00
+0c
+06
+03
+03
+3e
+00
+ENDCHAR
+STARTCHAR C00f1
+ENCODING 1585
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C00f2
+ENCODING 1586
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+03
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C00f3
+ENCODING 1587
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+95
+95
+9f
+9e
+f0
+60
+ENDCHAR
+STARTCHAR C00f4
+ENCODING 1588
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+33
+00
+95
+95
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C00f5
+ENCODING 1589
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+99
+91
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C00f6
+ENCODING 1590
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+00
+0f
+99
+91
+9f
+f8
+70
+ENDCHAR
+STARTCHAR C00f7
+ENCODING 1591
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C00f8
+ENCODING 1592
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C00f9
+ENCODING 1593
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C00fa
+ENCODING 1594
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C00fb
+ENCODING 1601
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+07
+cd
+c7
+ff
+00
+00
+ENDCHAR
+STARTCHAR C00fc
+ENCODING 1602
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+07
+4d
+c7
+c3
+7e
+00
+ENDCHAR
+STARTCHAR C00fd
+ENCODING 1603
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+33
+23
+73
+03
+83
+fe
+00
+ENDCHAR
+STARTCHAR C00fe
+ENCODING 1604
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+63
+63
+63
+3e
+ENDCHAR
+STARTCHAR C00ff
+ENCODING 1605
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+1f
+3d
+67
+63
+60
+60
+ENDCHAR
+STARTCHAR C0100
+ENCODING 1606
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+22
+63
+63
+3e
+00
+ENDCHAR
+STARTCHAR C0101
+ENCODING 1607
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C0102
+ENCODING 1608
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0103
+ENCODING 1609
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0e
+db
+d9
+cd
+cc
+7c
+ENDCHAR
+STARTCHAR C0104
+ENCODING 1610
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+9f
+99
+cd
+7d
+00
+36
+ENDCHAR
+STARTCHAR C0105
+ENCODING 1632
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+0c
+18
+30
+60
+40
+00
+ENDCHAR
+STARTCHAR C0106
+ENCODING 1633
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+08
+1c
+3e
+1c
+08
+00
+ENDCHAR
+STARTCHAR C0107
+ENCODING 1634
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+18
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR C0108
+ENCODING 1635
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+3c
+66
+60
+30
+18
+0c
+06
+ENDCHAR
+STARTCHAR C0109
+ENCODING 1636
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+6b
+6b
+7f
+70
+30
+38
+18
+ENDCHAR
+STARTCHAR C010a
+ENCODING 1637
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1e
+38
+70
+1c
+38
+70
+3e
+ENDCHAR
+STARTCHAR C010b
+ENCODING 1638
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1c
+3e
+66
+66
+66
+7e
+3c
+ENDCHAR
+STARTCHAR C010c
+ENCODING 1639
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7c
+7c
+0c
+0c
+0c
+0c
+0c
+ENDCHAR
+STARTCHAR C010d
+ENCODING 1640
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+66
+66
+3c
+3c
+18
+ENDCHAR
+STARTCHAR C010e
+ENCODING 1641
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+3c
+66
+66
+66
+66
+ENDCHAR
+STARTCHAR C010f
+ENCODING 8211
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+7e
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0110
+ENCODING 8212
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+7e
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0111
+ENCODING 8216
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+18
+0c
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0112
+ENCODING 8217
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0c
+18
+30
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0113
+ENCODING 8220
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+33
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0114
+ENCODING 8221
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+66
+66
+cc
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0115
+ENCODING 8249
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+18
+30
+18
+00
+00
+ENDCHAR
+STARTCHAR C0116
+ENCODING 8250
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+18
+0c
+18
+00
+00
+ENDCHAR
+STARTCHAR C0117
+ENCODING 8364
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1e
+30
+7c
+30
+7c
+30
+1e
+00
+ENDCHAR
+STARTCHAR C0118
+ENCODING 8592
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+30
+7e
+30
+18
+00
+00
+ENDCHAR
+STARTCHAR C0119
+ENCODING 8593
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+7e
+18
+18
+18
+00
+ENDCHAR
+STARTCHAR C011a
+ENCODING 8594
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+0c
+7e
+0c
+18
+00
+00
+ENDCHAR
+STARTCHAR C011b
+ENCODING 8595
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+18
+18
+7e
+3c
+18
+00
+ENDCHAR
+STARTCHAR C011c
+ENCODING 8624
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+7e
+78
+7c
+6e
+66
+06
+00
+ENDCHAR
+STARTCHAR C011d
+ENCODING 9243
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+78
+60
+78
+60
+7e
+18
+1e
+00
+ENDCHAR
+STARTCHAR C011e
+ENCODING 9473
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+ff
+ff
+00
+00
+00
+ENDCHAR
+STARTCHAR C011f
+ENCODING 9475
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+03
+03
+03
+03
+ENDCHAR
+STARTCHAR C0120
+ENCODING 9487
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+1f
+1f
+18
+18
+18
+ENDCHAR
+STARTCHAR C0121
+ENCODING 9491
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+f8
+f8
+18
+18
+18
+ENDCHAR
+STARTCHAR C0122
+ENCODING 9495
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+1f
+1f
+00
+00
+00
+ENDCHAR
+STARTCHAR C0123
+ENCODING 9499
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+f8
+f8
+00
+00
+00
+ENDCHAR
+STARTCHAR C0124
+ENCODING 9507
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+1f
+1f
+18
+18
+18
+ENDCHAR
+STARTCHAR C0125
+ENCODING 9515
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+f8
+f8
+18
+18
+18
+ENDCHAR
+STARTCHAR C0126
+ENCODING 9523
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+ff
+ff
+18
+18
+18
+ENDCHAR
+STARTCHAR C0127
+ENCODING 9531
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+ff
+ff
+00
+00
+00
+ENDCHAR
+STARTCHAR C0128
+ENCODING 9547
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+ff
+ff
+18
+18
+18
+ENDCHAR
+STARTCHAR C0129
+ENCODING 9585
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+07
+0e
+1c
+38
+70
+e0
+c0
+ENDCHAR
+STARTCHAR C012a
+ENCODING 9586
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+c0
+e0
+70
+38
+1c
+0e
+07
+03
+ENDCHAR
+STARTCHAR C012b
+ENCODING 9601
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+00
+00
+ff
+ff
+ENDCHAR
+STARTCHAR C012c
+ENCODING 9604
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ENDCHAR
+STARTCHAR C012d
+ENCODING 9612
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+ENDCHAR
+STARTCHAR C012e
+ENCODING 9614
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+c0
+ENDCHAR
+STARTCHAR C012f
+ENCODING 9620
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+ff
+ff
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0130
+ENCODING 9622
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+f0
+f0
+f0
+f0
+ENDCHAR
+STARTCHAR C0131
+ENCODING 9623
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+00
+0f
+0f
+0f
+0f
+ENDCHAR
+STARTCHAR C0132
+ENCODING 9624
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+f0
+f0
+f0
+f0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0133
+ENCODING 9629
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0f
+0f
+0f
+0f
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR C0134
+ENCODING 9654
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+10
+18
+1c
+1e
+1c
+18
+10
+00
+ENDCHAR
+STARTCHAR C0135
+ENCODING 9664
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+08
+18
+38
+78
+38
+18
+08
+00
+ENDCHAR
+STARTCHAR C0136
+ENCODING 9670
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+7e
+7e
+3c
+18
+00
+ENDCHAR
+STARTCHAR C0137
+ENCODING 9679
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+3c
+7e
+7e
+7e
+3c
+00
+ENDCHAR
+STARTCHAR C0138
+ENCODING 9698
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+01
+03
+07
+0f
+1f
+3f
+7f
+ff
+ENDCHAR
+STARTCHAR C0139
+ENCODING 9699
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+80
+c0
+e0
+f0
+f8
+fc
+fe
+ff
+ENDCHAR
+STARTCHAR C013a
+ENCODING 9824
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+3c
+7e
+7e
+18
+3c
+00
+ENDCHAR
+STARTCHAR C013b
+ENCODING 9827
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1c
+1c
+77
+77
+08
+1c
+00
+ENDCHAR
+STARTCHAR C013c
+ENCODING 9829
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+7f
+7f
+3e
+1c
+08
+00
+ENDCHAR
+STARTCHAR C013d
+ENCODING 62456
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+23
+33
+1b
+0b
+0e
+7c
+00
+ENDCHAR
+STARTCHAR C013e
+ENCODING 65152
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+1c
+30
+1c
+38
+20
+00
+ENDCHAR
+STARTCHAR C013f
+ENCODING 65153
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+18
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR C0140
+ENCODING 65154
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+18
+18
+18
+18
+18
+18
+18
+ENDCHAR
+STARTCHAR C0141
+ENCODING 65157
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+cf
+1b
+0f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0142
+ENCODING 65158
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+60
+cf
+1b
+0f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0143
+ENCODING 65165
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+03
+03
+00
+00
+ENDCHAR
+STARTCHAR C0144
+ENCODING 65166
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+03
+03
+00
+00
+ENDCHAR
+STARTCHAR C0145
+ENCODING 65167
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+c3
+c3
+7e
+00
+18
+ENDCHAR
+STARTCHAR C0146
+ENCODING 65168
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+c3
+c3
+7e
+00
+18
+ENDCHAR
+STARTCHAR C0147
+ENCODING 65169
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+03
+03
+ff
+00
+06
+ENDCHAR
+STARTCHAR C0148
+ENCODING 65170
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+c3
+c3
+7e
+00
+18
+ENDCHAR
+STARTCHAR C0149
+ENCODING 65171
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1b
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C014a
+ENCODING 65172
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+1b
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C014b
+ENCODING 65173
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C014c
+ENCODING 65174
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C014d
+ENCODING 65175
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+6c
+00
+03
+03
+ff
+00
+00
+ENDCHAR
+STARTCHAR C014e
+ENCODING 65176
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+36
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C014f
+ENCODING 65177
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C0150
+ENCODING 65178
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C0151
+ENCODING 65179
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+03
+03
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0152
+ENCODING 65180
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+c3
+c3
+7e
+00
+00
+ENDCHAR
+STARTCHAR C0153
+ENCODING 65181
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+60
+63
+38
+ENDCHAR
+STARTCHAR C0154
+ENCODING 65182
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+60
+63
+38
+ENDCHAR
+STARTCHAR C0155
+ENCODING 65183
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+78
+4c
+06
+ff
+00
+0c
+ENDCHAR
+STARTCHAR C0156
+ENCODING 65184
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+60
+63
+38
+ENDCHAR
+STARTCHAR C0157
+ENCODING 65185
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C0158
+ENCODING 65186
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C0159
+ENCODING 65187
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+78
+4c
+06
+ff
+00
+00
+ENDCHAR
+STARTCHAR C015a
+ENCODING 65188
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C015b
+ENCODING 65189
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C015c
+ENCODING 65190
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C015d
+ENCODING 65191
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+00
+78
+4c
+06
+ff
+00
+00
+ENDCHAR
+STARTCHAR C015e
+ENCODING 65192
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+78
+0c
+3e
+63
+61
+60
+3c
+ENDCHAR
+STARTCHAR C015f
+ENCODING 65193
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0160
+ENCODING 65194
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0161
+ENCODING 65195
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+00
+0c
+06
+03
+03
+3e
+00
+ENDCHAR
+STARTCHAR C0162
+ENCODING 65196
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+00
+0c
+06
+03
+03
+3e
+00
+ENDCHAR
+STARTCHAR C0163
+ENCODING 65197
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0164
+ENCODING 65198
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0165
+ENCODING 65199
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+03
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0166
+ENCODING 65200
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+03
+00
+06
+03
+03
+06
+7c
+ENDCHAR
+STARTCHAR C0167
+ENCODING 65201
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+95
+95
+9f
+9e
+f0
+60
+ENDCHAR
+STARTCHAR C0168
+ENCODING 65202
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+95
+95
+9f
+9e
+f0
+60
+ENDCHAR
+STARTCHAR C0169
+ENCODING 65203
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+49
+db
+ff
+00
+00
+ENDCHAR
+STARTCHAR C016a
+ENCODING 65204
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+95
+95
+9f
+9e
+f0
+60
+ENDCHAR
+STARTCHAR C016b
+ENCODING 65205
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+33
+00
+95
+95
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C016c
+ENCODING 65206
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+33
+00
+95
+95
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C016d
+ENCODING 65207
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+66
+00
+49
+db
+ff
+00
+00
+ENDCHAR
+STARTCHAR C016e
+ENCODING 65208
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+33
+00
+95
+95
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C016f
+ENCODING 65209
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+99
+91
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C0170
+ENCODING 65210
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+99
+91
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C0171
+ENCODING 65211
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+59
+f1
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0172
+ENCODING 65212
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+99
+91
+9f
+f0
+60
+ENDCHAR
+STARTCHAR C0173
+ENCODING 65213
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+00
+0f
+99
+91
+9f
+f8
+70
+ENDCHAR
+STARTCHAR C0174
+ENCODING 65214
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+00
+0f
+99
+91
+9f
+f8
+70
+ENDCHAR
+STARTCHAR C0175
+ENCODING 65215
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+18
+00
+0f
+59
+f1
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0176
+ENCODING 65216
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+0c
+00
+0f
+99
+91
+9f
+f8
+70
+ENDCHAR
+STARTCHAR C0177
+ENCODING 65217
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0178
+ENCODING 65218
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0179
+ENCODING 65219
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017a
+ENCODING 65220
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017b
+ENCODING 65221
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017c
+ENCODING 65222
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017d
+ENCODING 65223
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017e
+ENCODING 65224
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+60
+6f
+79
+71
+ff
+00
+00
+ENDCHAR
+STARTCHAR C017f
+ENCODING 65225
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0180
+ENCODING 65226
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0181
+ENCODING 65227
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+1c
+3e
+30
+18
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0182
+ENCODING 65228
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0183
+ENCODING 65229
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0184
+ENCODING 65230
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0185
+ENCODING 65231
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+1c
+3e
+30
+18
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0186
+ENCODING 65232
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+60
+0e
+18
+18
+3f
+61
+70
+3e
+ENDCHAR
+STARTCHAR C0187
+ENCODING 65233
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+07
+cd
+c7
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0188
+ENCODING 65234
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+07
+cd
+c7
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0189
+ENCODING 65235
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+30
+00
+0f
+0d
+07
+ff
+00
+00
+ENDCHAR
+STARTCHAR C018a
+ENCODING 65236
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+30
+07
+cd
+c7
+ff
+00
+00
+ENDCHAR
+STARTCHAR C018b
+ENCODING 65237
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+07
+4d
+c7
+c3
+7e
+00
+ENDCHAR
+STARTCHAR C018c
+ENCODING 65238
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+07
+4d
+c7
+c3
+7e
+00
+ENDCHAR
+STARTCHAR C018d
+ENCODING 65239
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+6c
+00
+1f
+19
+0f
+ff
+00
+00
+ENDCHAR
+STARTCHAR C018e
+ENCODING 65240
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+36
+00
+07
+4d
+c7
+c3
+7e
+00
+ENDCHAR
+STARTCHAR C018f
+ENCODING 65241
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+33
+23
+73
+03
+83
+fe
+00
+ENDCHAR
+STARTCHAR C0190
+ENCODING 65242
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+33
+23
+73
+03
+83
+fe
+00
+ENDCHAR
+STARTCHAR C0191
+ENCODING 65243
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+1c
+06
+03
+03
+3e
+00
+ENDCHAR
+STARTCHAR C0192
+ENCODING 65244
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+33
+23
+73
+03
+83
+fe
+00
+ENDCHAR
+STARTCHAR C0193
+ENCODING 65245
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+63
+63
+63
+3e
+ENDCHAR
+STARTCHAR C0194
+ENCODING 65246
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+63
+63
+63
+3e
+ENDCHAR
+STARTCHAR C0195
+ENCODING 65247
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+03
+ff
+00
+00
+ENDCHAR
+STARTCHAR C0196
+ENCODING 65248
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+03
+03
+03
+63
+63
+63
+3e
+ENDCHAR
+STARTCHAR C0197
+ENCODING 65249
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+1f
+3d
+67
+63
+60
+60
+ENDCHAR
+STARTCHAR C0198
+ENCODING 65250
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+1f
+3d
+67
+63
+60
+60
+ENDCHAR
+STARTCHAR C0199
+ENCODING 65251
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+07
+0d
+fd
+07
+00
+ENDCHAR
+STARTCHAR C019a
+ENCODING 65252
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+06
+1f
+3d
+67
+63
+60
+60
+ENDCHAR
+STARTCHAR C019b
+ENCODING 65253
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+22
+63
+63
+3e
+00
+ENDCHAR
+STARTCHAR C019c
+ENCODING 65254
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+22
+63
+63
+3e
+00
+ENDCHAR
+STARTCHAR C019d
+ENCODING 65255
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0c
+00
+03
+03
+ff
+00
+00
+ENDCHAR
+STARTCHAR C019e
+ENCODING 65256
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+18
+00
+22
+63
+63
+3e
+00
+ENDCHAR
+STARTCHAR C019f
+ENCODING 65257
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C01a0
+ENCODING 65258
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C01a1
+ENCODING 65259
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+10
+3e
+27
+39
+ff
+00
+00
+ENDCHAR
+STARTCHAR C01a2
+ENCODING 65260
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1b
+1f
+00
+00
+ENDCHAR
+STARTCHAR C01a3
+ENCODING 65261
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C01a4
+ENCODING 65262
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0f
+1b
+1f
+03
+06
+7c
+ENDCHAR
+STARTCHAR C01a5
+ENCODING 65263
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0e
+db
+d9
+cd
+cc
+7c
+ENDCHAR
+STARTCHAR C01a6
+ENCODING 65264
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+0e
+db
+d9
+cd
+cc
+7c
+ENDCHAR
+STARTCHAR C01a7
+ENCODING 65265
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+9f
+99
+cd
+7d
+00
+36
+ENDCHAR
+STARTCHAR C01a8
+ENCODING 65266
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+9f
+99
+cd
+7d
+00
+36
+ENDCHAR
+STARTCHAR C01a9
+ENCODING 65267
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+00
+00
+03
+03
+ff
+00
+36
+ENDCHAR
+STARTCHAR C01aa
+ENCODING 65268
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+00
+0e
+9f
+99
+cd
+7d
+00
+36
+ENDCHAR
+STARTCHAR C01ab
+ENCODING 65271
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+03
+23
+33
+1b
+0b
+0e
+7c
+00
+ENDCHAR
+STARTCHAR C01ac
+ENCODING 65533
+SWIDTH 666 0
+DWIDTH 8 0
+BBX 8 8 0 -2
+BITMAP
+3c
+66
+5a
+76
+7e
+76
+3c
+00
+ENDCHAR
+ENDFONT
diff --git a/fonts/fauxtari-8.psf b/fonts/fauxtari-8.psf
new file mode 100644
index 0000000..a58b0e0
--- /dev/null
+++ b/fonts/fauxtari-8.psf
Binary files differ
diff --git a/fonts/fauxtari-8.txt b/fonts/fauxtari-8.txt
new file mode 100644
index 0000000..f82836e
--- /dev/null
+++ b/fonts/fauxtari-8.txt
@@ -0,0 +1,4261 @@
+%PSF2
+Version: 0
+Flags: 1
+Length: 512
+Width: 8
+Height: 8
+%
+Unicode: [2665];
+Bitmap: \
+-------- \
+--##-##- \
+-####### \
+-####### \
+--#####- \
+---###-- \
+----#--- \
+--------
+%
+Unicode: [2523];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+---##### \
+---##### \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [2503];
+Bitmap: \
+------## \
+------## \
+------## \
+------## \
+------## \
+------## \
+------## \
+------##
+%
+Unicode: [251b];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+#####--- \
+#####--- \
+-------- \
+-------- \
+--------
+%
+Unicode: [252b];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+#####--- \
+#####--- \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [2513];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+#####--- \
+#####--- \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [2571];
+Bitmap: \
+------## \
+-----### \
+----###- \
+---###-- \
+--###--- \
+-###---- \
+###----- \
+##------
+%
+Unicode: [2572];
+Bitmap: \
+##------ \
+###----- \
+-###---- \
+--###--- \
+---###-- \
+----###- \
+-----### \
+------##
+%
+Unicode: [25e2];
+Bitmap: \
+-------# \
+------## \
+-----### \
+----#### \
+---##### \
+--###### \
+-####### \
+########
+%
+Unicode: [2597];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+----#### \
+----#### \
+----#### \
+----####
+%
+Unicode: [25e3];
+Bitmap: \
+#------- \
+##------ \
+###----- \
+####---- \
+#####--- \
+######-- \
+#######- \
+########
+%
+Unicode: [259d];
+Bitmap: \
+----#### \
+----#### \
+----#### \
+----#### \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [2598];
+Bitmap: \
+####---- \
+####---- \
+####---- \
+####---- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [2594];
+Bitmap: \
+######## \
+######## \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [2581];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+######## \
+########
+%
+Unicode: [2596];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+####---- \
+####---- \
+####---- \
+####----
+%
+Unicode: [2663];
+Bitmap: \
+-------- \
+---###-- \
+---###-- \
+-###-### \
+-###-### \
+----#--- \
+---###-- \
+--------
+%
+Unicode: [250f];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+---##### \
+---##### \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [2501];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+######## \
+######## \
+-------- \
+-------- \
+--------
+%
+Unicode: [254b];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+######## \
+######## \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [25cf];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-######- \
+-######- \
+-######- \
+--####-- \
+--------
+%
+Unicode: [2584];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+######## \
+######## \
+######## \
+########
+%
+Unicode: [258e];
+Bitmap: \
+##------ \
+##------ \
+##------ \
+##------ \
+##------ \
+##------ \
+##------ \
+##------
+%
+Unicode: [2533];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+######## \
+######## \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [253b];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+######## \
+######## \
+-------- \
+-------- \
+--------
+%
+Unicode: [258c];
+Bitmap: \
+####---- \
+####---- \
+####---- \
+####---- \
+####---- \
+####---- \
+####---- \
+####----
+%
+Unicode: [2517];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+---##### \
+---##### \
+-------- \
+-------- \
+--------
+%
+Unicode: [0118];[241b];
+Bitmap: \
+-####--- \
+-##----- \
+-####--- \
+-##----- \
+-######- \
+---##--- \
+---####- \
+--------
+%
+Unicode: [2191];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+-######- \
+---##--- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [2193];
+Bitmap: \
+-------- \
+---##--- \
+---##--- \
+---##--- \
+-######- \
+--####-- \
+---##--- \
+--------
+%
+Unicode: [2190];
+Bitmap: \
+-------- \
+---##--- \
+--##---- \
+-######- \
+--##---- \
+---##--- \
+-------- \
+--------
+%
+Unicode: [2192];
+Bitmap: \
+-------- \
+---##--- \
+----##-- \
+-######- \
+----##-- \
+---##--- \
+-------- \
+--------
+%
+Unicode: [0020];[00a0];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [0021];
+Bitmap: \
+-------- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+-------- \
+---##--- \
+--------
+%
+Unicode: [0022];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [0023];
+Bitmap: \
+-------- \
+-##--##- \
+######## \
+-##--##- \
+-##--##- \
+######## \
+-##--##- \
+--------
+%
+Unicode: [0024];
+Bitmap: \
+---##--- \
+--#####- \
+-##----- \
+--####-- \
+-----##- \
+-#####-- \
+---##--- \
+--------
+%
+Unicode: [0025];
+Bitmap: \
+-------- \
+-##--##- \
+-##-##-- \
+---##--- \
+--##---- \
+-##--##- \
+-#---##- \
+--------
+%
+Unicode: [0026];
+Bitmap: \
+---###-- \
+--##-##- \
+---###-- \
+--###--- \
+-##-#### \
+-##--##- \
+--###-## \
+--------
+%
+Unicode: [0027];
+Bitmap: \
+-------- \
+---##--- \
+---##--- \
+---##--- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [0028];
+Bitmap: \
+-------- \
+----###- \
+---###-- \
+---##--- \
+---##--- \
+---###-- \
+----###- \
+--------
+%
+Unicode: [0029];
+Bitmap: \
+-------- \
+-###---- \
+--###--- \
+---##--- \
+---##--- \
+--###--- \
+-###---- \
+--------
+%
+Unicode: [002a];
+Bitmap: \
+-------- \
+-##--##- \
+--####-- \
+######## \
+--####-- \
+-##--##- \
+-------- \
+--------
+%
+Unicode: [002b];
+Bitmap: \
+-------- \
+---##--- \
+---##--- \
+-######- \
+---##--- \
+---##--- \
+-------- \
+--------
+%
+Unicode: [002c];[00b8];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+---##--- \
+---##--- \
+--##----
+%
+Unicode: [002d];[00ad];[2013];[2014];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-######- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [002e];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [002f];
+Bitmap: \
+-------- \
+-----##- \
+----##-- \
+---##--- \
+--##---- \
+-##----- \
+-#------ \
+--------
+%
+Unicode: [0030];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##-###- \
+-###-##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0031];
+Bitmap: \
+-------- \
+---##--- \
+--###--- \
+---##--- \
+---##--- \
+---##--- \
+-######- \
+--------
+%
+Unicode: [0032];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+----##-- \
+---##--- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [0033];
+Bitmap: \
+-------- \
+-######- \
+----##-- \
+---##--- \
+----##-- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0034];
+Bitmap: \
+-------- \
+----##-- \
+---###-- \
+--####-- \
+-##-##-- \
+-######- \
+----##-- \
+--------
+%
+Unicode: [0035];
+Bitmap: \
+-------- \
+-######- \
+-##----- \
+-#####-- \
+-----##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0036];
+Bitmap: \
+-------- \
+--####-- \
+-##----- \
+-#####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0037];
+Bitmap: \
+-------- \
+-######- \
+-----##- \
+----##-- \
+---##--- \
+--##---- \
+--##---- \
+--------
+%
+Unicode: [0038];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+--####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0039];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+--#####- \
+-----##- \
+----##-- \
+--###--- \
+--------
+%
+Unicode: [003a];
+Bitmap: \
+-------- \
+-------- \
+---##--- \
+---##--- \
+-------- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [003b];
+Bitmap: \
+-------- \
+-------- \
+---##--- \
+---##--- \
+-------- \
+---##--- \
+---##--- \
+--##----
+%
+Unicode: [003c];
+Bitmap: \
+-----##- \
+----##-- \
+---##--- \
+--##---- \
+---##--- \
+----##-- \
+-----##- \
+--------
+%
+Unicode: [003d];
+Bitmap: \
+-------- \
+-------- \
+-######- \
+-------- \
+-------- \
+-######- \
+-------- \
+--------
+%
+Unicode: [003e];
+Bitmap: \
+-##----- \
+--##---- \
+---##--- \
+----##-- \
+---##--- \
+--##---- \
+-##----- \
+--------
+%
+Unicode: [003f];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+----##-- \
+---##--- \
+-------- \
+---##--- \
+--------
+%
+Unicode: [0040];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##-###- \
+-##-###- \
+-##----- \
+--#####- \
+--------
+%
+Unicode: [0041];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+-##--##- \
+-##--##- \
+-######- \
+-##--##- \
+--------
+%
+Unicode: [0042];
+Bitmap: \
+-------- \
+-#####-- \
+-##--##- \
+-#####-- \
+-##--##- \
+-##--##- \
+-#####-- \
+--------
+%
+Unicode: [0043];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##----- \
+-##----- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0044];
+Bitmap: \
+-------- \
+-####--- \
+-##-##-- \
+-##--##- \
+-##--##- \
+-##-##-- \
+-####--- \
+--------
+%
+Unicode: [0045];
+Bitmap: \
+-------- \
+-######- \
+-##----- \
+-#####-- \
+-##----- \
+-##----- \
+-######- \
+--------
+%
+Unicode: [0046];
+Bitmap: \
+-------- \
+-######- \
+-##----- \
+-#####-- \
+-##----- \
+-##----- \
+-##----- \
+--------
+%
+Unicode: [0047];
+Bitmap: \
+-------- \
+--#####- \
+-##----- \
+-##----- \
+-##-###- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [0048];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+-######- \
+-##--##- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [0049];
+Bitmap: \
+-------- \
+-######- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+-######- \
+--------
+%
+Unicode: [004a];
+Bitmap: \
+-------- \
+-----##- \
+-----##- \
+-----##- \
+-----##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [004b];
+Bitmap: \
+-------- \
+-##--##- \
+-##-##-- \
+-####--- \
+-####--- \
+-##-##-- \
+-##--##- \
+--------
+%
+Unicode: [004c];
+Bitmap: \
+-------- \
+-##----- \
+-##----- \
+-##----- \
+-##----- \
+-##----- \
+-######- \
+--------
+%
+Unicode: [004d];
+Bitmap: \
+-------- \
+-##---## \
+-###-### \
+-####### \
+-##-#-## \
+-##---## \
+-##---## \
+--------
+%
+Unicode: [004e];
+Bitmap: \
+-------- \
+-##--##- \
+-###-##- \
+-######- \
+-######- \
+-##-###- \
+-##--##- \
+--------
+%
+Unicode: [004f];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0050];
+Bitmap: \
+-------- \
+-#####-- \
+-##--##- \
+-##--##- \
+-#####-- \
+-##----- \
+-##----- \
+--------
+%
+Unicode: [0051];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##-##-- \
+--##-##- \
+--------
+%
+Unicode: [0052];
+Bitmap: \
+-------- \
+-#####-- \
+-##--##- \
+-##--##- \
+-#####-- \
+-##-##-- \
+-##--##- \
+--------
+%
+Unicode: [0053];
+Bitmap: \
+-------- \
+--####-- \
+-##----- \
+--####-- \
+-----##- \
+-----##- \
+--####-- \
+--------
+%
+Unicode: [0054];
+Bitmap: \
+-------- \
+-######- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [0055];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+-######- \
+--------
+%
+Unicode: [0056];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+---##--- \
+--------
+%
+Unicode: [0057];
+Bitmap: \
+-------- \
+-##---## \
+-##---## \
+-##-#-## \
+-####### \
+-###-### \
+-##---## \
+--------
+%
+Unicode: [0058];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+--####-- \
+--####-- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [0059];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+--####-- \
+---##--- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [005a];
+Bitmap: \
+-------- \
+-######- \
+----##-- \
+---##--- \
+--##---- \
+-##----- \
+-######- \
+--------
+%
+Unicode: [005b];
+Bitmap: \
+-------- \
+---####- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---####- \
+--------
+%
+Unicode: [005c];
+Bitmap: \
+-------- \
+-#------ \
+-##----- \
+--##---- \
+---##--- \
+----##-- \
+-----##- \
+--------
+%
+Unicode: [005d];
+Bitmap: \
+-------- \
+-####--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+-####--- \
+--------
+%
+Unicode: [005e];
+Bitmap: \
+-------- \
+----#--- \
+---###-- \
+--##-##- \
+-##---## \
+-------- \
+-------- \
+--------
+%
+Unicode: [005f];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+-------- \
+######## \
+--------
+%
+Unicode: [25c6];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+-######- \
+-######- \
+--####-- \
+---##--- \
+--------
+%
+Unicode: [0061];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [0062];
+Bitmap: \
+-------- \
+-##----- \
+-##----- \
+-#####-- \
+-##--##- \
+-##--##- \
+-#####-- \
+--------
+%
+Unicode: [0063];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-##----- \
+-##----- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [0064];
+Bitmap: \
+-------- \
+-----##- \
+-----##- \
+--#####- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [0065];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-##--##- \
+-######- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [0066];
+Bitmap: \
+-------- \
+----###- \
+---##--- \
+--#####- \
+---##--- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [0067];
+Bitmap: \
+-------- \
+-------- \
+--#####- \
+-##--##- \
+-##--##- \
+--#####- \
+-----##- \
+-#####--
+%
+Unicode: [0068];
+Bitmap: \
+-------- \
+-##----- \
+-##----- \
+-#####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [0069];
+Bitmap: \
+-------- \
+---##--- \
+-------- \
+--###--- \
+---##--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [006a];
+Bitmap: \
+-------- \
+-----##- \
+-------- \
+-----##- \
+-----##- \
+-----##- \
+-----##- \
+--####--
+%
+Unicode: [006b];
+Bitmap: \
+-------- \
+-##----- \
+-##----- \
+-##-##-- \
+-####--- \
+-##-##-- \
+-##--##- \
+--------
+%
+Unicode: [006c];
+Bitmap: \
+-------- \
+--###--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [006d];
+Bitmap: \
+-------- \
+-------- \
+-##--##- \
+-####### \
+-####### \
+-##-#-## \
+-##---## \
+--------
+%
+Unicode: [006e];
+Bitmap: \
+-------- \
+-------- \
+-#####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [006f];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [0070];
+Bitmap: \
+-------- \
+-------- \
+-#####-- \
+-##--##- \
+-##--##- \
+-#####-- \
+-##----- \
+-##-----
+%
+Unicode: [0071];
+Bitmap: \
+-------- \
+-------- \
+--#####- \
+-##--##- \
+-##--##- \
+--#####- \
+-----##- \
+-----##-
+%
+Unicode: [0072];
+Bitmap: \
+-------- \
+-------- \
+-#####-- \
+-##--##- \
+-##----- \
+-##----- \
+-##----- \
+--------
+%
+Unicode: [0073];
+Bitmap: \
+-------- \
+-------- \
+--#####- \
+-##----- \
+--####-- \
+-----##- \
+-#####-- \
+--------
+%
+Unicode: [0074];
+Bitmap: \
+-------- \
+---##--- \
+-######- \
+---##--- \
+---##--- \
+---##--- \
+----###- \
+--------
+%
+Unicode: [0075];
+Bitmap: \
+-------- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [0076];
+Bitmap: \
+-------- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+---##--- \
+--------
+%
+Unicode: [0077];
+Bitmap: \
+-------- \
+-------- \
+-##---## \
+-##-#-## \
+-####### \
+--#####- \
+--##-##- \
+--------
+%
+Unicode: [0078];
+Bitmap: \
+-------- \
+-------- \
+-##--##- \
+--####-- \
+---##--- \
+--####-- \
+-##--##- \
+--------
+%
+Unicode: [0079];
+Bitmap: \
+-------- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+----##-- \
+-####---
+%
+Unicode: [007a];
+Bitmap: \
+-------- \
+-------- \
+-######- \
+----##-- \
+---##--- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [2660];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+-######- \
+-######- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [007c];[0622];[fe81];[fe82];
+Bitmap: \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [21b0];
+Bitmap: \
+-------- \
+-######- \
+-####--- \
+-#####-- \
+-##-###- \
+-##--##- \
+-----##- \
+--------
+%
+Unicode: [25c0];
+Bitmap: \
+----#--- \
+---##--- \
+--###--- \
+-####--- \
+--###--- \
+---##--- \
+----#--- \
+--------
+%
+Unicode: [25b6];
+Bitmap: \
+---#---- \
+---##--- \
+---###-- \
+---####- \
+---###-- \
+---##--- \
+---#---- \
+--------
+%
+Unicode: [00e1];
+Bitmap: \
+----##-- \
+---##--- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00f9];
+Bitmap: \
+--##---- \
+---##--- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00d1];
+Bitmap: \
+--##-##- \
+-##-##-- \
+-------- \
+-###-##- \
+-###-##- \
+-######- \
+-##-###- \
+--------
+%
+Unicode: [00c9];
+Bitmap: \
+----##-- \
+---##--- \
+-######- \
+-##----- \
+-#####-- \
+-##----- \
+-######- \
+--------
+%
+Unicode: [00e7];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-##----- \
+-##----- \
+--####-- \
+---##--- \
+--##----
+%
+Unicode: [00f4];
+Bitmap: \
+--####-- \
+-##--##- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [00f2];
+Bitmap: \
+--##---- \
+---##--- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [00ec];
+Bitmap: \
+--##---- \
+---##--- \
+-------- \
+--###--- \
+---##--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [00a3];
+Bitmap: \
+---###-- \
+--##---- \
+--##---- \
+-####--- \
+--##---- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [00ef];
+Bitmap: \
+-------- \
+-##--##- \
+-------- \
+--###--- \
+---##--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [00fc];
+Bitmap: \
+-------- \
+-##--##- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00e4];
+Bitmap: \
+--##-##- \
+-------- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00d6];
+Bitmap: \
+-##--##- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [00fa];
+Bitmap: \
+----##-- \
+---##--- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00f3];
+Bitmap: \
+----##-- \
+---##--- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [00f6];
+Bitmap: \
+-------- \
+-##--##- \
+-------- \
+--####-- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [00dc];
+Bitmap: \
+-##--##- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+-######- \
+--------
+%
+Unicode: [00e5];
+Bitmap: \
+--####-- \
+-##--##- \
+---###-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00fb];
+Bitmap: \
+--####-- \
+-##--##- \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00ee];
+Bitmap: \
+--####-- \
+-##--##- \
+-------- \
+--###--- \
+---##--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [00e9];
+Bitmap: \
+----##-- \
+---##--- \
+--####-- \
+-##--##- \
+-######- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [00e8];
+Bitmap: \
+--##---- \
+---##--- \
+--####-- \
+-##--##- \
+-######- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [00f1];
+Bitmap: \
+--##-##- \
+-##-##-- \
+-------- \
+-#####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [00ea];
+Bitmap: \
+--####-- \
+##----## \
+--####-- \
+-##--##- \
+-######- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [0227];
+Bitmap: \
+---##--- \
+-------- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00e0];
+Bitmap: \
+--##---- \
+---##--- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [00a1];
+Bitmap: \
+---##--- \
+-------- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+--------
+%
+Unicode: [00c4];
+Bitmap: \
+-##--##- \
+-##--##- \
+---##--- \
+--####-- \
+-##--##- \
+-######- \
+-##--##- \
+--------
+%
+Unicode: [05d0];
+Bitmap: \
+-------- \
+##---##- \
+####-##- \
+##-####- \
+##--##-- \
+##---##- \
+-------- \
+--------
+%
+Unicode: [05d1];
+Bitmap: \
+-------- \
+#####--- \
+---###-- \
+----##-- \
+----##-- \
+#######- \
+-------- \
+--------
+%
+Unicode: [05d2];
+Bitmap: \
+-------- \
+--####-- \
+----##-- \
+----##-- \
+-#####-- \
+###--##- \
+-------- \
+--------
+%
+Unicode: [05d3];
+Bitmap: \
+-------- \
+#######- \
+---###-- \
+----##-- \
+----##-- \
+----##-- \
+-------- \
+--------
+%
+Unicode: [05d4];
+Bitmap: \
+-------- \
+######-- \
+-----##- \
+-#---##- \
+-##--##- \
+-##--##- \
+-------- \
+--------
+%
+Unicode: [05d5];
+Bitmap: \
+-------- \
+--####-- \
+---###-- \
+----##-- \
+----##-- \
+----##-- \
+-------- \
+--------
+%
+Unicode: [05d6];
+Bitmap: \
+-------- \
+######-- \
+-###---- \
+--##---- \
+--##---- \
+--##---- \
+-------- \
+--------
+%
+Unicode: [05d7];
+Bitmap: \
+-------- \
+######-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+-------- \
+--------
+%
+Unicode: [05d8];
+Bitmap: \
+-------- \
+##-####- \
+##-#-##- \
+##---##- \
+##---##- \
+######-- \
+-------- \
+--------
+%
+Unicode: [05d9];
+Bitmap: \
+-------- \
+-#####-- \
+---###-- \
+----##-- \
+-------- \
+-------- \
+-------- \
+--------
+%
+Unicode: [05da];
+Bitmap: \
+-------- \
+######-- \
+----###- \
+-----##- \
+-----##- \
+-----##- \
+-----##- \
+-----##-
+%
+Unicode: [05db];
+Bitmap: \
+-------- \
+######-- \
+-----##- \
+-----##- \
+----###- \
+######-- \
+-------- \
+--------
+%
+Unicode: [05dc];
+Bitmap: \
+##------ \
+######-- \
+-----##- \
+-----##- \
+----###- \
+--####-- \
+-------- \
+--------
+%
+Unicode: [05dd];
+Bitmap: \
+-------- \
+-######- \
+-##--##- \
+-##--##- \
+-##--##- \
+-######- \
+-------- \
+--------
+%
+Unicode: [05de];
+Bitmap: \
+-------- \
+##-###-- \
+-###-##- \
+-##--##- \
+-##--##- \
+-##-###- \
+-------- \
+--------
+%
+Unicode: [05df];
+Bitmap: \
+-------- \
+---####- \
+----###- \
+-----##- \
+-----##- \
+-----##- \
+-----##- \
+-----##-
+%
+Unicode: [05e0];
+Bitmap: \
+-------- \
+---####- \
+-----##- \
+-----##- \
+----###- \
+-#####-- \
+-------- \
+--------
+%
+Unicode: [05e1];
+Bitmap: \
+-------- \
+#######- \
+-##--##- \
+-##--##- \
+-##-##-- \
+-####--- \
+-------- \
+--------
+%
+Unicode: [05e2];
+Bitmap: \
+-------- \
+###-###- \
+-##--##- \
+--##-##- \
+--##-##- \
+######-- \
+-------- \
+--------
+%
+Unicode: [05e3];
+Bitmap: \
+-------- \
+######-- \
+-##-###- \
+-##--##- \
+-----##- \
+-----##- \
+-----##- \
+-----##-
+%
+Unicode: [05e4];
+Bitmap: \
+-------- \
+######-- \
+-##--##- \
+-##--##- \
+----###- \
+######-- \
+-------- \
+--------
+%
+Unicode: [05e5];
+Bitmap: \
+-------- \
+##--###- \
+-##--##- \
+-##-##-- \
+-####--- \
+-##----- \
+-##----- \
+-##-----
+%
+Unicode: [05e6];
+Bitmap: \
+-------- \
+##---##- \
+-##-###- \
+--###--- \
+----##-- \
+#######- \
+-------- \
+--------
+%
+Unicode: [05e7];
+Bitmap: \
+-------- \
+######-- \
+----###- \
+##---##- \
+##--##-- \
+##-##--- \
+##------ \
+##------
+%
+Unicode: [05e8];
+Bitmap: \
+-------- \
+######-- \
+----###- \
+-----##- \
+-----##- \
+-----##- \
+-------- \
+--------
+%
+Unicode: [05e9];
+Bitmap: \
+-------- \
+#--#--#- \
+##-#--#- \
+###--##- \
+##--##-- \
+######-- \
+-------- \
+--------
+%
+Unicode: [05ea];
+Bitmap: \
+-------- \
+######-- \
+-##-###- \
+-##--##- \
+-##--##- \
+###--##- \
+-------- \
+--------
+%
+Unicode: [0179];
+Bitmap: \
+---##--- \
+-######- \
+--##-##- \
+----##-- \
+---##--- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [0105];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-----##- \
+--#####- \
+-##--##- \
+--#####- \
+------##
+%
+Unicode: [017a];
+Bitmap: \
+----##-- \
+---##--- \
+-######- \
+----##-- \
+---##--- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [0107];
+Bitmap: \
+----##-- \
+---##--- \
+--####-- \
+-##----- \
+-##----- \
+-##----- \
+--####-- \
+--------
+%
+Unicode: [015a];
+Bitmap: \
+---##--- \
+--####-- \
+-##----- \
+--####-- \
+-----##- \
+-----##- \
+--####-- \
+--------
+%
+Unicode: [0119];
+Bitmap: \
+-------- \
+-------- \
+--####-- \
+-##--##- \
+-######- \
+-##----- \
+--####-- \
+-----##-
+%
+Unicode: [00df];
+Bitmap: \
+-------- \
+---###-- \
+--##-##- \
+--####-- \
+--##-##- \
+--##-### \
+--#####- \
+-##-----
+%
+Unicode: [0141];
+Bitmap: \
+-------- \
+-##----- \
+-##----- \
+-####--- \
+-###---- \
+###----- \
+-######- \
+--------
+%
+Unicode: [0142];
+Bitmap: \
+-------- \
+--###--- \
+---##--- \
+---###-- \
+--###--- \
+---##--- \
+--####-- \
+--------
+%
+Unicode: [0143];
+Bitmap: \
+----##-- \
+-#-##-#- \
+-##--##- \
+-######- \
+-######- \
+-##-###- \
+-##--##- \
+--------
+%
+Unicode: [0144];
+Bitmap: \
+----##-- \
+---##--- \
+-#####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--------
+%
+Unicode: [00d3];
+Bitmap: \
+-----##- \
+--####-- \
+-##-#-#- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+--------
+%
+Unicode: [015b];
+Bitmap: \
+----##-- \
+---##--- \
+--#####- \
+-##----- \
+--####-- \
+-----##- \
+-#####-- \
+--------
+%
+Unicode: [0106];
+Bitmap: \
+----##-- \
+--####-- \
+-##-###- \
+-##----- \
+-##----- \
+-##--##- \
+--#####- \
+--------
+%
+Unicode: [0104];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+-##--##- \
+-##--##- \
+-######- \
+-##--##- \
+------##
+%
+Unicode: [017b];
+Bitmap: \
+---##--- \
+-######- \
+----##-- \
+---##--- \
+--##---- \
+-##----- \
+-######- \
+--------
+%
+Unicode: [017c];
+Bitmap: \
+---##--- \
+-------- \
+-######- \
+----##-- \
+---##--- \
+--##---- \
+-######- \
+--------
+%
+Unicode: [0660];
+Bitmap: \
+-------- \
+-----##- \
+----##-- \
+---##--- \
+--##---- \
+-##----- \
+-#------ \
+--------
+%
+Unicode: [0661];
+Bitmap: \
+-------- \
+-------- \
+----#--- \
+---###-- \
+--#####- \
+---###-- \
+----#--- \
+--------
+%
+Unicode: [0662];
+Bitmap: \
+-------- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##--- \
+---##---
+%
+Unicode: [0663];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+-##----- \
+--##---- \
+---##--- \
+----##-- \
+-----##-
+%
+Unicode: [0664];
+Bitmap: \
+-------- \
+-##-#-## \
+-##-#-## \
+-####### \
+-###---- \
+--##---- \
+--###--- \
+---##---
+%
+Unicode: [0665];
+Bitmap: \
+-------- \
+---####- \
+--###--- \
+-###---- \
+---###-- \
+--###--- \
+-###---- \
+--#####-
+%
+Unicode: [0666];
+Bitmap: \
+-------- \
+---###-- \
+--#####- \
+-##--##- \
+-##--##- \
+-##--##- \
+-######- \
+--####--
+%
+Unicode: [0667];
+Bitmap: \
+-------- \
+-#####-- \
+-#####-- \
+----##-- \
+----##-- \
+----##-- \
+----##-- \
+----##--
+%
+Unicode: [0668];
+Bitmap: \
+-------- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##- \
+--####-- \
+--####-- \
+---##---
+%
+Unicode: [0669];
+Bitmap: \
+-------- \
+---##--- \
+--####-- \
+--####-- \
+-##--##- \
+-##--##- \
+-##--##- \
+-##--##-
+%
+Unicode: [0624];[fe85];[fe86];
+Bitmap: \
+-------- \
+-##----- \
+##--#### \
+---##-## \
+----#### \
+------## \
+-----##- \
+-#####--
+%
+Unicode: [0634];[feb5];[feb6];[feb8];
+Bitmap: \
+----##-- \
+--##--## \
+-------- \
+#--#-#-# \
+#--#-#-# \
+#--##### \
+####---- \
+-##-----
+%
+Unicode: [0648];[feed];[feee];
+Bitmap: \
+-------- \
+-------- \
+----#### \
+---##-## \
+---##### \
+------## \
+-----##- \
+-#####--
+%
+Unicode: [0629];[fe93];[fe94];
+Bitmap: \
+---##-## \
+-------- \
+----#### \
+---##-## \
+---##-## \
+---##### \
+-------- \
+--------
+%
+Unicode: [064a];[fef1];[fef2];[fef4];
+Bitmap: \
+-------- \
+----###- \
+#--##### \
+#--##--# \
+##--##-# \
+-#####-# \
+-------- \
+--##-##-
+%
+Unicode: [062b];[fe99];[fe9a];[fe9c];
+Bitmap: \
+---##--- \
+-##--##- \
+-------- \
+##----## \
+##----## \
+-######- \
+-------- \
+--------
+%
+Unicode: [0628];[fe8f];[fe90];[fe92];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+##----## \
+##----## \
+-######- \
+-------- \
+---##---
+%
+Unicode: [0644];[fedd];[fede];[fee0];
+Bitmap: \
+------## \
+------## \
+------## \
+------## \
+-##---## \
+-##---## \
+-##---## \
+--#####-
+%
+Unicode: [0621];[fe80];
+Bitmap: \
+-------- \
+-------- \
+---###-- \
+--##---- \
+---###-- \
+--###--- \
+--#----- \
+--------
+%
+Unicode: [0647];[fee9];[feea];[feec];
+Bitmap: \
+-------- \
+-------- \
+----#### \
+---##-## \
+---##-## \
+---##### \
+-------- \
+--------
+%
+Unicode: [062a];[fe95];[fe96];[fe98];
+Bitmap: \
+-------- \
+--##-##- \
+-------- \
+##----## \
+##----## \
+-######- \
+-------- \
+--------
+%
+Unicode: [0646];[fee5];[fee6];[fee8];
+Bitmap: \
+-------- \
+---##--- \
+-------- \
+--#---#- \
+-##---## \
+-##---## \
+--#####- \
+--------
+%
+Unicode: [0645];[fee1];[fee2];[fee4];
+Bitmap: \
+-------- \
+-----##- \
+---##### \
+--####-# \
+-##--### \
+-##---## \
+-##----- \
+-##-----
+%
+Unicode: [062c];[fe9d];[fe9e];[fea0];
+Bitmap: \
+-------- \
+-####--- \
+----##-- \
+--#####- \
+-##---## \
+-##----- \
+-##---## \
+--###---
+%
+Unicode: [062e];[fea5];[fea6];[fea8];
+Bitmap: \
+------## \
+-####--- \
+----##-- \
+--#####- \
+-##---## \
+-##----# \
+-##----- \
+--####--
+%
+Unicode: [062d];[fea1];[fea2];[fea4];
+Bitmap: \
+-------- \
+-####--- \
+----##-- \
+--#####- \
+-##---## \
+-##----# \
+-##----- \
+--####--
+%
+Unicode: [0636];[febd];[febe];[fec0];
+Bitmap: \
+----##-- \
+-------- \
+----#### \
+#--##--# \
+#--#---# \
+#--##### \
+#####--- \
+-###----
+%
+Unicode: [0642];[fed5];[fed6];[fed8];
+Bitmap: \
+--##-##- \
+-------- \
+-----### \
+-#--##-# \
+##---### \
+##----## \
+-######- \
+--------
+%
+Unicode: [0633];[feb1];[feb2];[feb4];
+Bitmap: \
+-------- \
+-------- \
+#--#-#-# \
+#--#-#-# \
+#--##### \
+#--####- \
+####---- \
+-##-----
+%
+Unicode: [0641];[fed1];[fed2];[fed4];
+Bitmap: \
+-------- \
+--##---- \
+-----### \
+##--##-# \
+##---### \
+######## \
+-------- \
+--------
+%
+Unicode: [0639];[fec9];[feca];[fecc];
+Bitmap: \
+-------- \
+----###- \
+---##--- \
+---##--- \
+--###### \
+-##----# \
+-###---- \
+--#####-
+%
+Unicode: [0643];[fed9];[feda];[fedc];
+Bitmap: \
+------## \
+--##--## \
+--#---## \
+-###--## \
+------## \
+#-----## \
+#######- \
+--------
+%
+Unicode: [0635];[feb9];[feba];[febc];
+Bitmap: \
+-------- \
+-------- \
+----#### \
+#--##--# \
+#--#---# \
+#--##### \
+####---- \
+-##-----
+%
+Unicode: [063a];[fecd];[fece];[fed0];
+Bitmap: \
+-##----- \
+----###- \
+---##--- \
+---##--- \
+--###### \
+-##----# \
+-###---- \
+--#####-
+%
+Unicode: [0649];[feef];[fef0];
+Bitmap: \
+-------- \
+-------- \
+----###- \
+##-##-## \
+##-##--# \
+##--##-# \
+##--##-- \
+-#####--
+%
+Unicode: [0632];[feaf];[feb0];
+Bitmap: \
+-------- \
+------## \
+-------- \
+-----##- \
+------## \
+------## \
+-----##- \
+-#####--
+%
+Unicode: [feb7];
+Bitmap: \
+---##--- \
+-##--##- \
+-------- \
+-#--#--# \
+##-##-## \
+######## \
+-------- \
+--------
+%
+Unicode: [062f];[fea9];[feaa];[0631];[fead];[feae];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-----##- \
+------## \
+------## \
+-----##- \
+-#####--
+%
+Unicode: [0630];[feab];[feac];
+Bitmap: \
+--##---- \
+-------- \
+----##-- \
+-----##- \
+------## \
+------## \
+--#####- \
+--------
+%
+Unicode: [fef3];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+------## \
+------## \
+######## \
+-------- \
+--##-##-
+%
+Unicode: [fe9b];
+Bitmap: \
+---##--- \
+-##--##- \
+-------- \
+------## \
+------## \
+######## \
+-------- \
+--------
+%
+Unicode: [fe91];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+------## \
+------## \
+######## \
+-------- \
+-----##-
+%
+Unicode: [fedf];
+Bitmap: \
+------## \
+------## \
+------## \
+------## \
+------## \
+######## \
+-------- \
+--------
+%
+Unicode: [0627];[fe8d];[fe8e];
+Bitmap: \
+------## \
+------## \
+------## \
+------## \
+------## \
+------## \
+-------- \
+--------
+%
+Unicode: [feeb];
+Bitmap: \
+-------- \
+---#---- \
+--#####- \
+--#--### \
+--###--# \
+######## \
+-------- \
+--------
+%
+Unicode: [fe97];
+Bitmap: \
+-------- \
+-##-##-- \
+-------- \
+------## \
+------## \
+######## \
+-------- \
+--------
+%
+Unicode: [fee7];
+Bitmap: \
+-------- \
+----##-- \
+-------- \
+------## \
+------## \
+######## \
+-------- \
+--------
+%
+Unicode: [fee3];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-----### \
+----##-# \
+######-# \
+-----### \
+--------
+%
+Unicode: [fe9f];
+Bitmap: \
+-------- \
+-------- \
+-####--- \
+-#--##-- \
+-----##- \
+######## \
+-------- \
+----##--
+%
+Unicode: [fef7];[f3f8];
+Bitmap: \
+------## \
+--#---## \
+--##--## \
+---##-## \
+----#-## \
+----###- \
+-#####-- \
+--------
+%
+Unicode: [fea7];
+Bitmap: \
+--##---- \
+-------- \
+-####--- \
+-#--##-- \
+-----##- \
+######## \
+-------- \
+--------
+%
+Unicode: [fea3];
+Bitmap: \
+-------- \
+-------- \
+-####--- \
+-#--##-- \
+-----##- \
+######## \
+-------- \
+--------
+%
+Unicode: [febf];
+Bitmap: \
+---##--- \
+-------- \
+----#### \
+-#-##--# \
+####---# \
+######## \
+-------- \
+--------
+%
+Unicode: [fed7];
+Bitmap: \
+-##-##-- \
+-------- \
+---##### \
+---##--# \
+----#### \
+######## \
+-------- \
+--------
+%
+Unicode: [feb3];
+Bitmap: \
+-------- \
+-------- \
+-------- \
+-#--#--# \
+##-##-## \
+######## \
+-------- \
+--------
+%
+Unicode: [fed3];
+Bitmap: \
+--##---- \
+-------- \
+----#### \
+----##-# \
+-----### \
+######## \
+-------- \
+--------
+%
+Unicode: [fecb];
+Bitmap: \
+-------- \
+---###-- \
+--#####- \
+--##---- \
+---##--- \
+######## \
+-------- \
+--------
+%
+Unicode: [fedb];
+Bitmap: \
+-------- \
+-------- \
+---###-- \
+-----##- \
+------## \
+------## \
+--#####- \
+--------
+%
+Unicode: [febb];
+Bitmap: \
+-------- \
+-------- \
+----#### \
+-#-##--# \
+####---# \
+######## \
+-------- \
+--------
+%
+Unicode: [0637];[fec1];[fec2];[fec4];[fec3];
+Bitmap: \
+-##----- \
+-##----- \
+-##-#### \
+-####--# \
+-###---# \
+######## \
+-------- \
+--------
+%
+Unicode: [fecf];
+Bitmap: \
+-##----- \
+---###-- \
+--#####- \
+--##---- \
+---##--- \
+######## \
+-------- \
+--------
+%
+Unicode: [0638];[fec5];[fec6];[fec8];[fec7];
+Bitmap: \
+-##-##-- \
+-##----- \
+-##-#### \
+-####--# \
+-###---# \
+######## \
+-------- \
+--------
+%
+Unicode: [061f];
+Bitmap: \
+-------- \
+--####-- \
+-##--##- \
+--##---- \
+---##--- \
+-------- \
+---##--- \
+--------
+%
+// dotted-box (no such glyph)
+Unicode: [0000];
+Bitmap: \
+ -------- \
+ -##-###- \
+ -#------ \
+ ------#- \
+ -#------ \
+ ------#- \
+ -###-##- \
+ --------
+%
+// backtick
+Unicode: [0060];
+Bitmap: \
+ -------- \
+ --##---- \
+ --##---- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// curlies
+Unicode: [007b];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ ---##--- \
+ --##---- \
+ ---##--- \
+ ---##--- \
+ ----##-- \
+ --------
+%
+Unicode: [007d];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ ---##--- \
+ ----##-- \
+ ---##--- \
+ ---##--- \
+ --##---- \
+ --------
+%
+// tilde
+Unicode: [007e];
+Bitmap: \
+ -------- \
+ -###--## \
+ ##-##-## \
+ ##--###- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// euro
+Unicode: [20ac];
+Bitmap: \
+ ---####- \
+ --##---- \
+ -#####-- \
+ --##---- \
+ -#####-- \
+ --##---- \
+ ---####- \
+ --------
+%
+// spanish left-quote
+Unicode: [00ab];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ -##--##- \
+ ##--##-- \
+ -##--##- \
+ -------- \
+ --------
+%
+// spanish right-quote
+Unicode: [00bb];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ##--##-- \
+ -##--##- \
+ ##--##-- \
+ -------- \
+ --------
+%
+// spanish inverted question mark
+Unicode: [00bf];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -------- \
+ ---##--- \
+ ----##-- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// copyright
+Unicode: [00a9];
+Bitmap: \
+ -#####-- \
+ #-----#- \
+ #--##-#- \
+ #-#---#- \
+ #--##-#- \
+ #-----#- \
+ -#####-- \
+ --------
+%
+// registered
+Unicode: [00ae];
+Bitmap: \
+ -#####-- \
+ #-----#- \
+ #-##--#- \
+ #-#-#-#- \
+ #-##--#- \
+ #-#-#-#- \
+ -#####-- \
+ --------
+%
+// degrees
+Unicode: [00b0];[00ba];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// cents
+Unicode: [00a2];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --#####- \
+ -##----- \
+ -##----- \
+ --#####- \
+ ---##--- \
+ --------
+%
+// "currency sign"
+// FIXME: not bold enough
+Unicode: [00a4];
+Bitmap: \
+ -------- \
+ -#----#- \
+ --####-- \
+ --#--#-- \
+ --#--#-- \
+ --####-- \
+ -#----#- \
+ --------
+%
+// yen
+Unicode: [00a5];
+Bitmap: \
+ -##--##- \
+ -##--##- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ --------
+%
+// broken bar
+Unicode: [00a6];
+Bitmap: \
+ -------- \
+ ---##--- \
+ ---##--- \
+ -------- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ --------
+%
+// section sign
+// FIXME: not bold enough
+Unicode: [00a7];
+Bitmap: \
+ ---###-- \
+ --#----- \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ -----#-- \
+ --###--- \
+ --------
+%
+// diaresis (cha, cha, cha!)
+Unicode: [00a8];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// feminine ordinal (superscript a)
+Unicode: [00aa];
+Bitmap: \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####- \
+ -------- \
+ -------- \
+ --------
+%
+// "not" sign
+Unicode: [00ac];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ -######- \
+ -----##- \
+ -------- \
+ -------- \
+ --------
+%
+// macron
+Unicode: [00af];
+Bitmap: \
+ -------- \
+ -######- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// plus-minus
+Unicode: [00b1];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ -------- \
+ -######- \
+ -------- \
+ --------
+%
+// superscript 2
+// FIXME: not bold enough
+Unicode: [00b2];
+Bitmap: \
+ -------- \
+ --##---- \
+ -#--#--- \
+ ---#---- \
+ --#----- \
+ -####--- \
+ -------- \
+ --------
+%
+// FIXME: not bold enough
+// superscript 3
+Unicode: [00b3];
+Bitmap: \
+ -------- \
+ --##---- \
+ -#--#--- \
+ ---#---- \
+ -#--#--- \
+ --##---- \
+ -------- \
+ --------
+%
+// acute
+Unicode: [00b4];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// mu
+Unicode: [00b5];
+Bitmap: \
+ -------- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ -----##- \
+ --------
+%
+// paragraph
+Unicode: [00b6];
+Bitmap: \
+ -------- \
+ --##-##- \
+ -###-##- \
+ -###-##- \
+ --##-##- \
+ ---#-##- \
+ ---#-##- \
+ --------
+%
+// middle dot
+Unicode: [00b7];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ ---##--- \
+ -------- \
+ -------- \
+ --------
+%
+// superscript 1
+Unicode: [00b9];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --###--- \
+ ---##--- \
+ --####-- \
+ -------- \
+ -------- \
+ --------
+// FIXME: MISSING fractions, 00bc/00bd/00bc, ¼ ½ ¾, hard to do in 8x8
+%
+// A with grave
+Unicode: [00c0];
+Bitmap: \
+ -------- \
+ --##---- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with acute
+Unicode: [00c1];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with circumflex
+Unicode: [00c2];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with tilde
+Unicode: [00c3];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with ring
+Unicode: [00c5];
+Bitmap: \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// AE ligature
+Unicode: [00c6];
+Bitmap: \
+ -------- \
+ --#####- \
+ -####--- \
+ ##-##--- \
+ #######- \
+ ##-##--- \
+ ##-####- \
+ --------
+// FIXME: this is hideous!
+%
+// C with cedilla
+Unicode: [00c7];
+Bitmap: \
+ -------- \
+ --####-- \
+ -##--##- \
+ -##----- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ --##----
+%
+// E with circumflex
+Unicode: [00ca];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -######- \
+ -##----- \
+ -#####-- \
+ -##----- \
+ -######- \
+ --------
+// FIXME: ugly!
+%
+// E with umlaut
+Unicode: [00cb];
+Bitmap: \
+ --##-##- \
+ -------- \
+ -######- \
+ -##----- \
+ -#####-- \
+ -##----- \
+ -######- \
+ --------
+%
+// I with grave
+Unicode: [00cc];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// I with acute
+Unicode: [00cd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// I with circumflex
+Unicode: [00ce];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+// FIXME: ugly!
+%
+// I with umlaut
+Unicode: [00cf];
+Bitmap: \
+ --##-##- \
+ -------- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// capital eth
+Unicode: [00d0];
+Bitmap: \
+ -------- \
+ -####--- \
+ -##-##-- \
+ -##--##- \
+ ####-##- \
+ -##-##-- \
+ -####--- \
+ --------
+%
+// O with grave
+Unicode: [00d2];
+Bitmap: \
+ -##----- \
+ --####-- \
+ -#-#-##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+// FIXME: MISSING Ô Õ
+%
+// multiplication
+Unicode: [00d7];
+Bitmap: \
+ -------- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -------- \
+ --------
+// FIXME: MISSING Ø
+%
+// U with grave
+Unicode: [00d9];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -######- \
+ --------
+%
+// U with acute
+Unicode: [00da];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -######- \
+ --------
+// FIXME: MISSING Û
+%
+// Y with acute
+Unicode: [00dd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ ---##--- \
+ --------
+%
+// capital thorn
+Unicode: [00de];
+Bitmap: \
+ -------- \
+ -##----- \
+ -#####-- \
+ -##--##- \
+ -#####-- \
+ -##----- \
+ -##----- \
+ --------
+%
+// a with circumflex
+Unicode: [00e2];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####- \
+ --------
+%
+// a with tilde
+Unicode: [00e3];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####-
+// FIXME: touches bottom
+%
+// ae ligature
+Unicode: [00e6];
+Bitmap: \
+ -------- \
+ -------- \
+ -###-##- \
+ ---##-## \
+ -######- \
+ ##-##--- \
+ -######- \
+ --------
+// FIXME: fugly
+%
+// e with umlaut
+Unicode: [00eb];
+Bitmap: \
+ -##--##- \
+ -------- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##----- \
+ --####-- \
+ --------
+%
+// i with acute
+Unicode: [00ed];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -------- \
+ --###--- \
+ ---##--- \
+ ---##--- \
+ --####-- \
+ --------
+%
+// lowercase eth
+Unicode: [00f0];
+Bitmap: \
+ -##-#--- \
+ --##---- \
+ -#-##--- \
+ --####-- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// o with tilde
+Unicode: [00f5];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ -------- \
+ --####-- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// division
+Unicode: [00f7];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -------- \
+ -######- \
+ -------- \
+ ---##--- \
+ -------- \
+ --------
+// FIXME: MISSING ø
+%
+// y with acute
+Unicode: [00fd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ ----##-- \
+ -####---
+%
+// lowercase thorn
+Unicode: [00fe];
+Bitmap: \
+ -##----- \
+ -##----- \
+ -####--- \
+ -##-##-- \
+ -####--- \
+ -##----- \
+ -##----- \
+ --------
+%
+// y with umlaut
+Unicode: [00ff];
+Bitmap: \
+ -##--##- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ ----##-- \
+ -####---
+%
+// left single curly quote
+Unicode: [2018];
+Bitmap: \
+ -------- \
+ --##---- \
+ ---##--- \
+ ----##-- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// right single curly quote
+Unicode: [2019];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ --##---- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// left double curly quote
+Unicode: [201c];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ --##--## \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// right double curly quote
+Unicode: [201d];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ ##--##-- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// spanish left single quote
+Unicode: [2039];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ --##---- \
+ ---##--- \
+ -------- \
+ --------
+%
+// spanish right single quote
+Unicode: [203a];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ ----##-- \
+ ---##--- \
+ -------- \
+ --------
+%
+// replacement character for missing glyphs
+Unicode: [fffd];
+Bitmap: \
+ --####-- \
+ -##--##- \
+ -#-##-#- \
+ -###-##- \
+ -######- \
+ -###-##- \
+ --####-- \
+ --------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
+%
+Unicode: [0000];
+Bitmap: ----------------------------------------------------------------
diff --git a/fonts/fixbdf.pl b/fonts/fixbdf.pl
new file mode 100644
index 0000000..e0ba143
--- /dev/null
+++ b/fonts/fixbdf.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+# clean up BDF files created by psf2bdf.
+
+$px = shift || die "$0: missing pixel size argument";
+
+
+$pointsize = $px * 10;
+$avgwidth = $px * 10; # square font!
+
+$font = "-BW-Fauxtari Fixed Mono-Medium-R-Normal--$px-$pointsize-75-75-C-$avgwidth-iso10646-1";
+
+while(<>) {
+ chomp;
+ if(/^STARTPROPERTIES\s+(\d+)/) {
+ $oldprop = $1;
+ $newprop = $oldprop + 15;
+ print <<EOF;
+STARTPROPERTIES $newprop
+FOUNDRY "BW"
+FAMILY_NAME "Fauxtari Fixed Mono"
+FACE_NAME "Fauxtari $px"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE $px
+POINT_SIZE $pointsize
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH $avgwidth
+CHARSET_REGISTRY "iso10646"
+CHARSET_ENCODING "1"
+EOF
+ } elsif(/^FONT\s/) {
+ print "FONT $font\n";
+ } else {
+ print "$_\n";
+ }
+}
diff --git a/fonts/mkpsf.pl b/fonts/mkpsf.pl
new file mode 100644
index 0000000..8a349f1
--- /dev/null
+++ b/fonts/mkpsf.pl
@@ -0,0 +1,1358 @@
+#!/usr/bin/perl -w
+
+# Read raw font data from atari rom images, plus a few hand-drawn
+# "text bitmaps" from __DATA__.
+
+# Write 3 bitmap font "txt" files in the format txt2psf expects, then
+# runs txt2psf on them. Results in 3 fonts:
+
+# fauxtari-8.psf - 8x8 native size
+# fauxtari-16.psf - 16x16 scaled up
+# fauxtari-24.psf - 24x24 scaled up
+
+# The fiddly bits of this are getting the Unicode mappings correct.
+
+# ROM dumps are mapped to Atari address space at $C000, the regular
+# charset starts at $E000, so it's at offset $2000 (8192) in the
+# image. The XL international set is at $CC00, or offset $0C00 (3072).
+# In the Arabic ROM, the Arabic font takes the place of the standard
+# charset. All the charsets are 1K in size.
+
+# Arabic ROM, plus some info about it and a mention of the Hebrew ROM:
+# https://www.savetz.com/vintagecomputers/arabic65xe/
+
+use bytes;
+
+$fontname = "fauxtari";
+
+sub byte2line {
+ my $t = shift;
+ $t = sprintf("%08b", $t);
+ $t =~ y/0/-/;
+ $t =~ y/1/#/;
+ return $t;
+}
+
+sub scale_line {
+ my $line = shift;
+ my $scale = shift;
+ my $one = '#' x $scale;
+ my $zero = '-' x $scale;
+
+ $line =~ s/#/$one/g;
+ $line =~ s/-/$zero/g;
+ return ($line x $scale);
+}
+
+sub chr2output {
+ my $codepoint = shift;
+ my $bytes = shift;
+ my $scale = shift || 1;
+ my $unicode = "";
+
+ if(!ref $codepoint) {
+ $codepoint = [ $codepoint ];
+ }
+
+ $unicode .= sprintf("[%04x];", $_) for @$codepoint;
+
+ my $result = sprintf("%%\nUnicode: %s\nBitmap: \\\n", $unicode);
+ for(0..7) {
+ my $byte = $bytes->[$_];
+ my $line = byte2line($byte);
+ $result .= scale_line($line, $scale);
+ $result .= " \\" unless $_ == 7;
+ $result .= "\n";
+ }
+ return $result;
+}
+
+sub internal2byte {
+ my $t = shift;
+ $t =~ y/-/0/;
+ $t =~ y/#/1/;
+ return pack("B*", $t);
+}
+
+sub psf2txt_header {
+ my $charcount = shift;
+ my $scale = shift;
+ my $w = 8 * $scale;
+ my $h = 8 * $scale;
+ return <<EOF;
+%PSF2
+Version: 0
+Flags: 1
+Length: $charcount
+Width: $w
+Height: $h
+EOF
+}
+
+sub read_rom {
+ my $data;
+ my $filename = shift;
+ my $offset = shift;
+ my $charcount = shift;
+ my $len = $charcount * 8;
+ open my $fh, '<', $filename;
+ read($fh, $data, 16384);
+ close $fh;
+ return substr($data, $offset, $len);
+}
+
+# position in the map (array index) is the raw glyph number, in
+# the order we read the font data.
+# value is the Unicode codepoint. if there are multiple codepoints
+# for the glyph, make the value an array ref (see 0x1B below, the
+# Atari Escape glyph is both 0x0118 aka LATIN CAPITAL LETTER E WITH OGONEK,
+# and 0x241b aka SYMBOL FOR ESCAPE).
+sub setup_map {
+ our @map = (
+ 0x2665, # 0x00
+ 0x2523, # 0x01
+ 0x2503, # 0x02
+ 0x251b, # 0x03
+ 0x252b, # 0x04
+ 0x2513, # 0x05
+ 0x2571, # 0x06
+ 0x2572, # 0x07
+ 0x25e2, # 0x08
+ 0x2597, # 0x09
+ 0x25e3, # 0x0a
+ 0x259d, # 0x0b
+ 0x2598, # 0x0c
+ 0x2594, # 0x0d
+ 0x2581, # 0x0e
+ 0x2596, # 0x0f
+ 0x2663, # 0x10
+ 0x250f, # 0x11
+ 0x2501, # 0x12
+ 0x254b, # 0x13
+ 0x25cf, # 0x14
+ 0x2584, # 0x15
+ 0x258e, # 0x16
+ 0x2533, # 0x17
+ 0x253b, # 0x18
+ 0x258c, # 0x19
+ 0x2517, # 0x1a
+ [ 0x0118, 0x241b ], # 0x1b
+ 0x2191, # 0x1c
+ 0x2193, # 0x1d
+ 0x2190, # 0x1e
+ 0x2192, # 0x1f
+ [ 0x0020, 0xa0 ], # 0x20 (plus &nbsp;)
+ 0x0021, # 0x21
+ 0x0022, # 0x22
+ 0x0023, # 0x23
+ 0x0024, # 0x24
+ 0x0025, # 0x25
+ 0x0026, # 0x26
+ 0x0027, # 0x27
+ 0x0028, # 0x28
+ 0x0029, # 0x29
+ 0x002a, # 0x2a
+ 0x002b, # 0x2b
+ [ 0x002c, 0x00b8 ], # 0x2c (comma and cedilla)
+ [ 0x002d, 0x00ad, 0x2013, 0x2014 ], # 0x2d (plus soft hyphen, en, em)
+ 0x002e, # 0x2e
+ 0x002f, # 0x2f
+ 0x0030, # 0x30
+ 0x0031, # 0x31
+ 0x0032, # 0x32
+ 0x0033, # 0x33
+ 0x0034, # 0x34
+ 0x0035, # 0x35
+ 0x0036, # 0x36
+ 0x0037, # 0x37
+ 0x0038, # 0x38
+ 0x0039, # 0x39
+ 0x003a, # 0x3a
+ 0x003b, # 0x3b
+ 0x003c, # 0x3c
+ 0x003d, # 0x3d
+ 0x003e, # 0x3e
+ 0x003f, # 0x3f
+ 0x0040, # 0x40
+ 0x0041, # 0x41
+ 0x0042, # 0x42
+ 0x0043, # 0x43
+ 0x0044, # 0x44
+ 0x0045, # 0x45
+ 0x0046, # 0x46
+ 0x0047, # 0x47
+ 0x0048, # 0x48
+ 0x0049, # 0x49
+ 0x004a, # 0x4a
+ 0x004b, # 0x4b
+ 0x004c, # 0x4c
+ 0x004d, # 0x4d
+ 0x004e, # 0x4e
+ 0x004f, # 0x4f
+ 0x0050, # 0x50
+ 0x0051, # 0x51
+ 0x0052, # 0x52
+ 0x0053, # 0x53
+ 0x0054, # 0x54
+ 0x0055, # 0x55
+ 0x0056, # 0x56
+ 0x0057, # 0x57
+ 0x0058, # 0x58
+ 0x0059, # 0x59
+ 0x005a, # 0x5a
+ 0x005b, # 0x5b
+ 0x005c, # 0x5c
+ 0x005d, # 0x5d
+ 0x005e, # 0x5e
+ 0x005f, # 0x5f
+ 0x25c6, # 0x60
+ 0x0061, # 0x61
+ 0x0062, # 0x62
+ 0x0063, # 0x63
+ 0x0064, # 0x64
+ 0x0065, # 0x65
+ 0x0066, # 0x66
+ 0x0067, # 0x67
+ 0x0068, # 0x68
+ 0x0069, # 0x69
+ 0x006a, # 0x6a
+ 0x006b, # 0x6b
+ 0x006c, # 0x6c
+ 0x006d, # 0x6d
+ 0x006e, # 0x6e
+ 0x006f, # 0x6f
+ 0x0070, # 0x70
+ 0x0071, # 0x71
+ 0x0072, # 0x72
+ 0x0073, # 0x73
+ 0x0074, # 0x74
+ 0x0075, # 0x75
+ 0x0076, # 0x76
+ 0x0077, # 0x77
+ 0x0078, # 0x78
+ 0x0079, # 0x79
+ 0x007a, # 0x7a
+ 0x2660, # 0x7b
+ [ 0x007c, 0x0622, 0xfe81, 0xfe82 ], # 0x7c, pipe + arabic ﺁ
+ 0x21b0, # 0x7d
+ 0x25c0, # 0x7e
+ 0x25b6, # 0x7f
+
+# next, 28 "international" characters from the xl rom $cc00 area
+# á
+ 0x00e1, # 0x80
+# ù
+ 0x00f9, # 0x81
+# Ñ
+ 0x00d1, # 0x82
+# É
+ 0x00c9, # 0x83
+# ç
+ 0x00e7, # 0x84
+# ô (or is it?)
+ 0x00f4, # 0x85
+# ò
+ 0x00f2, # 0x86
+# ì
+ 0x00ec, # 0x87
+# £
+ 0x00a3, # 0x88
+# ï
+ 0x00ef, # 0x89
+# ü
+ 0x00fc, # 0x8a
+# ä
+ 0x00e4, # 0x8b
+# Ö
+ 0x00d6, # 0x8c
+# ú
+ 0x00fa, # 0x8d
+# ó
+ 0x00f3, # 0x8e
+# ö
+ 0x00f6, # 0x8f
+# Ü
+ 0x00dc, # 0x90
+# å
+ 0x00e5, # 0x91
+# û (?)
+ 0x00fb, # 0x92
+# î
+ 0x00ee, # 0x93
+# é
+ 0x00e9, # 0x94
+# è
+ 0x00e8, # 0x95
+# ñ
+ 0x00f1, # 0x96
+# ê
+ 0x00ea, # 0x97
+# ȧ
+ 0x0227, # 0x98
+# à
+ 0x00e0, # 0x99
+# ¡
+ 0x00a1, # 0x9a
+# Ä
+ 0x00c4, # 0x9b
+
+# hebrew rom is probably a 3rd-party hack, afaik never released by
+# atari, but i'm told the glyphs look good (by someone who reads hebrew),
+# so include it here.
+ 0x05d0, # 0x9c
+ 0x05d1, # 0x9d
+ 0x05d2, # 0x9e
+ 0x05d3, # 0x9f
+ 0x05d4, # 0xa0
+ 0x05d5, # 0xa1
+ 0x05d6, # 0xa2
+ 0x05d7, # 0xa3
+ 0x05d8, # 0xa4
+ 0x05d9, # 0xa5
+ 0x05da, # 0xa6
+ 0x05db, # 0xa7
+ 0x05dc, # 0xa8
+ 0x05dd, # 0xa9
+ 0x05de, # 0xaa
+ 0x05df, # 0xab
+ 0x05e0, # 0xac
+ 0x05e1, # 0xad
+ 0x05e2, # 0xae
+ 0x05e3, # 0xaf
+ 0x05e4, # 0xb0
+ 0x05e5, # 0xb1
+ 0x05e6, # 0xb2
+ 0x05e7, # 0xb3
+ 0x05e8, # 0xb4
+ 0x05e9, # 0xb5
+ 0x05ea, # 0xb6
+
+# polish rom. probably a 3rd-party hack, but there are a lot of polish
+# atari users out there.
+ 0x0179, # 0xb7
+ 0x0105, # 0xb8
+ 0x017a, # 0xb9
+ 0x0107, # 0xba
+ 0x015a, # 0xbb
+ 0x0119, # 0xbc
+# german sharp s, not polish at all:
+ 0x00df, # 0xbd
+ 0x0141, # 0xbe
+ 0x0142, # 0xbf
+ 0x0143, # 0xc0
+ 0x0144, # 0xc1
+ 0x00d3, # 0xc3
+# 0xc3 weird-looking v?
+# next glyph is e with ogonek, we already have it as esc
+ 0x015b, # 0xc4
+ 0x0106, # 0xc5
+ 0x0104, # 0xc6
+ 0x017b, # 0xc7
+ 0x017c, # 0xc8
+
+# the rest are from the arabic xe rom
+ 0x0660, # eastern arabic numeral 0
+ 0x0661, # eastern arabic numeral 1
+ 0x0662, # eastern arabic numeral 2
+ 0x0663, # eastern arabic numeral 3
+ 0x0664, # eastern arabic numeral 4
+ 0x0665, # eastern arabic numeral 5
+ 0x0666, # eastern arabic numeral 6
+ 0x0667, # eastern arabic numeral 7
+ 0x0668, # eastern arabic numeral 8
+ 0x0669, # eastern arabic numeral 9
+
+# todo: figure out the arabic letter mappings. might need someone who
+# actually reads arabic to make sense of them... what i've got is just
+# a guess.
+ [ 0x0624, 0xfe85, 0xfe86 ], # 0x3c, maybe?
+
+ [ 0x0634, 0xfeb5, 0xfeb6, 0xfeb8 ], # 0x41
+ [ 0x0648, 0xfeed, 0xfeee ], # 0x42
+ [ 0x0629, 0xfe93, 0xfe94 ], # 0x43
+ [ 0x064a, 0xfef1, 0xfef2, 0xfef4 ], # 0x44
+ [ 0x062b, 0xfe99, 0xfe9a, 0xfe9c ], # 0x45
+ [ 0x0628, 0xfe8f, 0xfe90, 0xfe92 ], # 0x46
+ [ 0x0644, 0xfedd, 0xfede, 0xfee0 ], # 0x47
+ [ 0x0621, 0xfe80 ], # 0x48
+ [ 0x0647, 0xfee9, 0xfeea, 0xfeec ], # 0x49
+ [ 0x062a, 0xfe95, 0xfe96, 0xfe98 ], # 0x4a
+ [ 0x0646, 0xfee5, 0xfee6, 0xfee8 ], # 0x4b
+ [ 0x0645, 0xfee1, 0xfee2, 0xfee4 ], # 0x4c
+ [ 0x062c, 0xfe9d, 0xfe9e, 0xfea0 ], # 0x4d
+ # xxx don't know what 0x4e is
+ [ 0x062e, 0xfea5, 0xfea6, 0xfea8 ], # 0x4f
+ [ 0x062d, 0xfea1, 0xfea2, 0xfea4 ], # 0x50
+ [ 0x0636, 0xfebd, 0xfebe, 0xfec0 ], # 0x51
+ [ 0x0642, 0xfed5, 0xfed6, 0xfed8 ], # 0x52
+ [ 0x0633, 0xfeb1, 0xfeb2, 0xfeb4 ], # 0x53
+ [ 0x0641, 0xfed1, 0xfed2, 0xfed4 ], # 0x54
+ [ 0x0639, 0xfec9, 0xfeca, 0xfecc ], # 0x55
+ [ 0x0643, 0xfed9, 0xfeda, 0xfedc ], # 0x56
+ [ 0x0635, 0xfeb9, 0xfeba, 0xfebc ], # 0x57
+ # xxx don't know what 0x58 is
+ [ 0x063a, 0xfecd, 0xfece, 0xfed0 ], # 0x59
+ [ 0x0649, 0xfeef, 0xfef0 ], # 0x5a
+ [ 0x0632, 0xfeaf, 0xfeb0 ], # 0x60
+ 0xfeb7, # 0x61
+ # xxx 0x62 isn't really both ﺩ and ﺭ but where's the atari's ﺭ at?
+ [ 0x062f, 0xfea9, 0xfeaa, 0x0631, 0xfead, 0xfeae ], # 0x62
+ [ 0x0630, 0xfeab, 0xfeac ], # 0x63
+ 0xfef3, # 0x64
+ 0xfe9b, # 0x65
+ 0xfe91, # 0x66
+ 0xfedf, # 0x67
+ [ 0x0627, 0xfe8d, 0xfe8e ], # 0x68
+ 0xfeeb, # 0x69
+ 0xfe97, # 0x6a
+ 0xfee7, # 0x6b
+ 0xfee3, # 0x6c
+ 0xfe9f, # 0x6d
+ [ 0xfef7, 0xf3f8 ], # 0x6e
+ 0xfea7, # 0x6f
+ 0xfea3, # 0x70
+ 0xfebf, # 0x71
+ 0xfed7, # 0x72
+ 0xfeb3, # 0x73
+ 0xfed3, # 0x74
+ 0xfecb, # 0x75
+ 0xfedb, # 0x76
+ 0xfebb, # 0x77
+ [ 0x0637, 0xfec1, 0xfec2, 0xfec4, 0xfec3 ], # 0x78
+ 0xfecf, # 0x79
+ [ 0x0638, 0xfec5, 0xfec6, 0xfec8, 0xfec7 ], # 0x7a
+ 0x061f, # 0x7f
+ );
+}
+
+### main()
+setup_map();
+
+@scale1 = ();
+@scale2 = ();
+@scale3 = ();
+
+$raw .= read_rom("atarixl.rom", 0x2200, 32);
+$raw .= read_rom("atarixl.rom", 0x2000, 32);
+$raw .= read_rom("atarixl.rom", 0x2100, 32);
+$raw .= read_rom("atarixl.rom", 0x2300, 32);
+$raw .= read_rom("atarixl.rom", 0xe00, 26);
+$raw .= read_rom("atarixl.rom", 0xf00, 1);
+$raw .= read_rom("atarixl.rom", 0xfd8, 1);
+
+$raw .= read_rom("xl_hebrew.rom", 0xf00, 27);
+
+$raw .= read_rom("xl_polish.rom", 0xe00, 6);
+$raw .= read_rom("xl_polish.rom", 0xe50, 5);
+$raw .= read_rom("xl_polish.rom", 0xe80, 1);
+$raw .= read_rom("xl_polish.rom", 0xe98, 1);
+$raw .= read_rom("xl_polish.rom", 0xeb0, 3);
+$raw .= read_rom("xl_polish.rom", 0xed0, 1);
+
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*15, 10);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x3c, 1);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x41, 13);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x4f, 9);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x59, 2);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x60, 27);
+$raw .= read_rom("xe_arabic.rom", 0x2000+8*0x7f, 1);
+
+$cnt = 0;
+while($raw =~ /(.{8})/gc) {
+ my @bytes;
+ my $got = $1;
+ my $chr = $map[$cnt++];
+ die "$0: incomplete map" unless defined $chr;
+ #warn $got;
+ push @bytes, ord(substr($got, $_, 1)) for(0..7);
+ #warn $_ for @bytes;
+ push @scale1, chr2output($chr, \@bytes, 1);
+ push @scale2, chr2output($chr, \@bytes, 2);
+ push @scale3, chr2output($chr, \@bytes, 3);
+}
+
+while(<DATA>) {
+ push @scale1, $_;
+ $cnt++ if /^%/;
+ if(/^\s*[-#]/) {
+ push @scale2, scale_line($_, 2);
+ push @scale3, scale_line($_, 3);
+ } else {
+ push @scale2, $_;
+ push @scale3, $_;
+ }
+}
+
+#warn "$cnt characters\n";
+#warn "(padding to 256 characters)\n" unless $cnt >= 256;
+#warn "(padding to 512 characters)\n" unless $cnt >= 512;
+
+# 512 glyphs is the max for a PSF font. There can be more
+# *codepoints*, because the Unicode directory allows the same
+# glyph to represent multiple codepoints (e.g. space and
+# non-breaking space).
+if($cnt > 512) {
+ die "$0: too many glyphs ($cnt > 512)";
+}
+
+# The kernel refuses to load a font that isn't exactly
+# 256 or 512 glyphs, so we have to pad with junk glyphs.
+while($cnt < 512) {
+ my $fake = "%\nUnicode: [0000];\nBitmap: ";
+ push @scale1, $fake . (("-" x 8) x 8) . "\n";
+ push @scale2, $fake . (("-" x 16) x 16) . "\n";
+ push @scale3, $fake . (("-" x 24) x 24) . "\n";
+ $cnt++;
+}
+
+#warn "$cnt characters with padding\n";
+
+# What is dupglyphs.pl for?
+# PSF allows the same glyph to represent multiple codepoints (e.g.
+# space and NBSP, or hyphen/soft-hyphen/en-dash). We only get 512
+# glyphs max for a PSF, so we definitely want to use this.
+# BDF on the other hand doesn't allow this. So if the same glyph
+# data is to be used for multiple codepoints in BDF, the glyph data
+# has to be repeated for each codepoint. Bloats the font, but not
+# too much. The BDF is also what gets made into the TTF. I'm pretty
+# sure TTF supports multiple codepoints per glyph, but until I
+# learn some other way besides bitmapfont2ttf to generate the TTF,
+# it also will have dup glyph bloat. On the bright side, dupglyphs.pl
+# removes all the padding characters required by the psf font.
+sub mkfonts {
+ my $px = shift;
+ my $scaled_data = shift;
+ my $scale = shift;
+
+ open $fh, '>', "$fontname-$px.txt" or die $!;
+ print $fh psf2txt_header($cnt, $scale);
+ print $fh $_ for(@$scaled_data);
+ close $fh;
+
+ system("txt2psf $fontname-$px.txt $fontname-$px.psf");
+ system("perl dupglyphs.pl $fontname-$px.txt | perl sorttxtfont.pl | txt2psf | psf2bdf --defchar=0 --iso10646 --fontname=$fontname-$px | perl ./fixbdf.pl $px > $fontname-$px.bdf");
+}
+
+mkfonts(8, \@scale1, 1);
+mkfonts(16, \@scale2, 2);
+mkfonts(24, \@scale3, 3);
+
+exit 0;
+
+__DATA__
+%
+// dotted-box (no such glyph)
+Unicode: [0000];
+Bitmap: \
+ -------- \
+ -##-###- \
+ -#------ \
+ ------#- \
+ -#------ \
+ ------#- \
+ -###-##- \
+ --------
+%
+// backtick
+Unicode: [0060];
+Bitmap: \
+ -------- \
+ --##---- \
+ --##---- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// curlies
+Unicode: [007b];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ ---##--- \
+ --##---- \
+ ---##--- \
+ ---##--- \
+ ----##-- \
+ --------
+%
+Unicode: [007d];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ ---##--- \
+ ----##-- \
+ ---##--- \
+ ---##--- \
+ --##---- \
+ --------
+%
+// tilde
+Unicode: [007e];
+Bitmap: \
+ -------- \
+ -###--## \
+ ##-##-## \
+ ##--###- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// euro
+Unicode: [20ac];
+Bitmap: \
+ ---####- \
+ --##---- \
+ -#####-- \
+ --##---- \
+ -#####-- \
+ --##---- \
+ ---####- \
+ --------
+%
+// spanish left-quote
+Unicode: [00ab];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ -##--##- \
+ ##--##-- \
+ -##--##- \
+ -------- \
+ --------
+%
+// spanish right-quote
+Unicode: [00bb];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ##--##-- \
+ -##--##- \
+ ##--##-- \
+ -------- \
+ --------
+%
+// spanish inverted question mark
+Unicode: [00bf];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -------- \
+ ---##--- \
+ ----##-- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// copyright
+Unicode: [00a9];
+Bitmap: \
+ -#####-- \
+ #-----#- \
+ #--##-#- \
+ #-#---#- \
+ #--##-#- \
+ #-----#- \
+ -#####-- \
+ --------
+%
+// registered
+Unicode: [00ae];
+Bitmap: \
+ -#####-- \
+ #-----#- \
+ #-##--#- \
+ #-#-#-#- \
+ #-##--#- \
+ #-#-#-#- \
+ -#####-- \
+ --------
+%
+// degrees
+Unicode: [00b0];[00ba];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// cents
+Unicode: [00a2];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --#####- \
+ -##----- \
+ -##----- \
+ --#####- \
+ ---##--- \
+ --------
+%
+// "currency sign"
+// FIXME: not bold enough
+Unicode: [00a4];
+Bitmap: \
+ -------- \
+ -#----#- \
+ --####-- \
+ --#--#-- \
+ --#--#-- \
+ --####-- \
+ -#----#- \
+ --------
+%
+// yen
+Unicode: [00a5];
+Bitmap: \
+ -##--##- \
+ -##--##- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ --------
+%
+// broken bar
+Unicode: [00a6];
+Bitmap: \
+ -------- \
+ ---##--- \
+ ---##--- \
+ -------- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ --------
+%
+// section sign
+// FIXME: not bold enough
+Unicode: [00a7];
+Bitmap: \
+ ---###-- \
+ --#----- \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ -----#-- \
+ --###--- \
+ --------
+%
+// diaresis (cha, cha, cha!)
+Unicode: [00a8];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// feminine ordinal (superscript a)
+Unicode: [00aa];
+Bitmap: \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####- \
+ -------- \
+ -------- \
+ --------
+%
+// "not" sign
+Unicode: [00ac];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ -######- \
+ -----##- \
+ -------- \
+ -------- \
+ --------
+%
+// macron
+Unicode: [00af];
+Bitmap: \
+ -------- \
+ -######- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// plus-minus
+Unicode: [00b1];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ -------- \
+ -######- \
+ -------- \
+ --------
+%
+// superscript 2
+// FIXME: not bold enough
+Unicode: [00b2];
+Bitmap: \
+ -------- \
+ --##---- \
+ -#--#--- \
+ ---#---- \
+ --#----- \
+ -####--- \
+ -------- \
+ --------
+%
+// FIXME: not bold enough
+// superscript 3
+Unicode: [00b3];
+Bitmap: \
+ -------- \
+ --##---- \
+ -#--#--- \
+ ---#---- \
+ -#--#--- \
+ --##---- \
+ -------- \
+ --------
+%
+// acute
+Unicode: [00b4];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ -------- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// mu
+Unicode: [00b5];
+Bitmap: \
+ -------- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ -----##- \
+ --------
+%
+// paragraph
+Unicode: [00b6];
+Bitmap: \
+ -------- \
+ --##-##- \
+ -###-##- \
+ -###-##- \
+ --##-##- \
+ ---#-##- \
+ ---#-##- \
+ --------
+%
+// middle dot
+Unicode: [00b7];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ ---##--- \
+ -------- \
+ -------- \
+ --------
+%
+// superscript 1
+Unicode: [00b9];
+Bitmap: \
+ -------- \
+ ---##--- \
+ --###--- \
+ ---##--- \
+ --####-- \
+ -------- \
+ -------- \
+ --------
+// FIXME: MISSING fractions, 00bc/00bd/00bc, ¼ ½ ¾, hard to do in 8x8
+%
+// A with grave
+Unicode: [00c0];
+Bitmap: \
+ -------- \
+ --##---- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with acute
+Unicode: [00c1];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with circumflex
+Unicode: [00c2];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with tilde
+Unicode: [00c3];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// A with ring
+Unicode: [00c5];
+Bitmap: \
+ ---##--- \
+ --#--#-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##--##- \
+ --------
+%
+// AE ligature
+Unicode: [00c6];
+Bitmap: \
+ -------- \
+ --#####- \
+ -####--- \
+ ##-##--- \
+ #######- \
+ ##-##--- \
+ ##-####- \
+ --------
+// FIXME: this is hideous!
+%
+// C with cedilla
+Unicode: [00c7];
+Bitmap: \
+ -------- \
+ --####-- \
+ -##--##- \
+ -##----- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ --##----
+%
+// E with circumflex
+Unicode: [00ca];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -######- \
+ -##----- \
+ -#####-- \
+ -##----- \
+ -######- \
+ --------
+// FIXME: ugly!
+%
+// E with umlaut
+Unicode: [00cb];
+Bitmap: \
+ --##-##- \
+ -------- \
+ -######- \
+ -##----- \
+ -#####-- \
+ -##----- \
+ -######- \
+ --------
+%
+// I with grave
+Unicode: [00cc];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// I with acute
+Unicode: [00cd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// I with circumflex
+Unicode: [00ce];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+// FIXME: ugly!
+%
+// I with umlaut
+Unicode: [00cf];
+Bitmap: \
+ --##-##- \
+ -------- \
+ -######- \
+ ---##--- \
+ ---##--- \
+ ---##--- \
+ -######- \
+ --------
+%
+// capital eth
+Unicode: [00d0];
+Bitmap: \
+ -------- \
+ -####--- \
+ -##-##-- \
+ -##--##- \
+ ####-##- \
+ -##-##-- \
+ -####--- \
+ --------
+%
+// O with grave
+Unicode: [00d2];
+Bitmap: \
+ -##----- \
+ --####-- \
+ -#-#-##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+// FIXME: MISSING Ô Õ
+%
+// multiplication
+Unicode: [00d7];
+Bitmap: \
+ -------- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ --####-- \
+ -##--##- \
+ -------- \
+ --------
+// FIXME: MISSING Ø
+%
+// U with grave
+Unicode: [00d9];
+Bitmap: \
+ --##---- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -######- \
+ --------
+%
+// U with acute
+Unicode: [00da];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ -######- \
+ --------
+// FIXME: MISSING Û
+%
+// Y with acute
+Unicode: [00dd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ ---##--- \
+ ---##--- \
+ --------
+%
+// capital thorn
+Unicode: [00de];
+Bitmap: \
+ -------- \
+ -##----- \
+ -#####-- \
+ -##--##- \
+ -#####-- \
+ -##----- \
+ -##----- \
+ --------
+%
+// a with circumflex
+Unicode: [00e2];
+Bitmap: \
+ --####-- \
+ -#----#- \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####- \
+ --------
+%
+// a with tilde
+Unicode: [00e3];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ -------- \
+ --####-- \
+ ----###- \
+ --##-##- \
+ ---####-
+// FIXME: touches bottom
+%
+// ae ligature
+Unicode: [00e6];
+Bitmap: \
+ -------- \
+ -------- \
+ -###-##- \
+ ---##-## \
+ -######- \
+ ##-##--- \
+ -######- \
+ --------
+// FIXME: fugly
+%
+// e with umlaut
+Unicode: [00eb];
+Bitmap: \
+ -##--##- \
+ -------- \
+ --####-- \
+ -##--##- \
+ -######- \
+ -##----- \
+ --####-- \
+ --------
+%
+// i with acute
+Unicode: [00ed];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -------- \
+ --###--- \
+ ---##--- \
+ ---##--- \
+ --####-- \
+ --------
+%
+// lowercase eth
+Unicode: [00f0];
+Bitmap: \
+ -##-#--- \
+ --##---- \
+ -#-##--- \
+ --####-- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// o with tilde
+Unicode: [00f5];
+Bitmap: \
+ --##-##- \
+ -##-##-- \
+ -------- \
+ --####-- \
+ -##--##- \
+ -##--##- \
+ --####-- \
+ --------
+%
+// division
+Unicode: [00f7];
+Bitmap: \
+ -------- \
+ ---##--- \
+ -------- \
+ -######- \
+ -------- \
+ ---##--- \
+ -------- \
+ --------
+// FIXME: MISSING ø
+%
+// y with acute
+Unicode: [00fd];
+Bitmap: \
+ ----##-- \
+ ---##--- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ ----##-- \
+ -####---
+%
+// lowercase thorn
+Unicode: [00fe];
+Bitmap: \
+ -##----- \
+ -##----- \
+ -####--- \
+ -##-##-- \
+ -####--- \
+ -##----- \
+ -##----- \
+ --------
+%
+// y with umlaut
+Unicode: [00ff];
+Bitmap: \
+ -##--##- \
+ -------- \
+ -##--##- \
+ -##--##- \
+ -##--##- \
+ --#####- \
+ ----##-- \
+ -####---
+%
+// left single curly quote
+Unicode: [2018];
+Bitmap: \
+ -------- \
+ --##---- \
+ ---##--- \
+ ----##-- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// right single curly quote
+Unicode: [2019];
+Bitmap: \
+ -------- \
+ ----##-- \
+ ---##--- \
+ --##---- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// left double curly quote
+Unicode: [201c];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ --##--## \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// right double curly quote
+Unicode: [201d];
+Bitmap: \
+ -------- \
+ -##--##- \
+ -##--##- \
+ ##--##-- \
+ -------- \
+ -------- \
+ -------- \
+ --------
+%
+// spanish left single quote
+Unicode: [2039];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ --##---- \
+ ---##--- \
+ -------- \
+ --------
+%
+// spanish right single quote
+Unicode: [203a];
+Bitmap: \
+ -------- \
+ -------- \
+ -------- \
+ ---##--- \
+ ----##-- \
+ ---##--- \
+ -------- \
+ --------
+%
+// replacement character for missing glyphs
+Unicode: [fffd];
+Bitmap: \
+ --####-- \
+ -##--##- \
+ -#-##-#- \
+ -###-##- \
+ -######- \
+ -###-##- \
+ --####-- \
+ --------
diff --git a/fonts/sorttxtfont.pl b/fonts/sorttxtfont.pl
new file mode 100644
index 0000000..62c37cc
--- /dev/null
+++ b/fonts/sorttxtfont.pl
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+# sort a font in psftools .txt format, by unicode codepoint.
+# only the *first* codepoint per glyph is used as the key.
+
+undef $/;
+$_ = <>;
+@glyphs = split "%";
+shift @glyphs;
+$header = "%" . (shift @glyphs);
+
+# 0 is a special case because fonts intended to become PSFs will
+# be padded with extra characters with encoding 0. only the first
+# one seen is the real one.
+$zeroseen = 0;
+
+for(@glyphs) {
+ my($cp, $dcp);
+ ($cp) = (/Unicode: \[([0-9a-fA-F]+)/);
+ $dcp = eval "0x$cp";
+ if($dcp == 0) {
+ next if $zeroseen++;
+ }
+ if(defined $sortme{$dcp}) {
+ warn "duplicate codepoint 0x$cp\n";
+ }
+ $sortme{$dcp} = $_;
+}
+
+for(sort { $a <=> $b } keys %sortme) {
+ push @sorted, $sortme{$_};
+}
+print join("%", $header, @sorted);
diff --git a/genopts.rst b/genopts.rst
new file mode 100644
index 0000000..dfc588a
--- /dev/null
+++ b/genopts.rst
@@ -0,0 +1,11 @@
+General Options
+---------------
+**--help**
+ Print usage message and exit.
+
+**--version**
+ Print version number and exit.
+
+**-v**
+ Verbose operation. When displaying a number in verbose mode, it will
+ be prefixed with *$* if it's in hex, or no prefix for decimal.
diff --git a/install-fonts.sh b/install-fonts.sh
new file mode 100644
index 0000000..7d803f8
--- /dev/null
+++ b/install-fonts.sh
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# Install the BDF fonts where they belong. DESTDIR, BDFDIR, and TTFDIR
+# must be given as arguments. If DESTDIR is blank, the X server and
+# fontconfig will be informed about the new fonts. If DESTDIR is NOT
+# blank, we're not really installing the fonts system-wide, so no
+# extra config will be done (the files will just be copied).
+
+DESTDIR="$1"
+BDFDIR="$2"
+TTFDIR="$3"
+
+SYSTEM=yes
+
+if [ "$DISPLAY" = "" ]; then
+ SYSTEM=no
+fi
+
+if [ "$DESTDIR" != "" ]; then
+ BDFDIR="$DESTDIR/$BDFDIR"
+ TTFDIR="$DESTDIR/$TTFDIR"
+ SYSTEM=no
+fi
+
+if [ "$#" != "3" -o "$BDFDIR" = "" ]; then
+ echo "usage: $0 <destdir> <bdfdir> <ttfdir>"
+ exit 1
+fi
+
+echo -n "$0: will "
+if [ "$SYSTEM" != "yes" ]; then
+ echo -n "NOT "
+fi
+echo "run mkfontdir/mkfontscale/xset/fc-cache"
+
+install_font() {
+ BDF=fauxtari-$1.bdf
+ ALIAS=fauxtari-$1
+ cp "fonts/$BDF" "$BDFDIR"
+ chown root:root "$BDFDIR/$BDF" &> /dev/null
+ if [ "$SYSTEM" = "yes" ]; then
+ ( cd "$BDFDIR"
+ mkfontdir
+ mkfontscale
+ if ! grep "^$ALIAS" fonts.alias &> /dev/null; then
+ NAME="$( grep "^$BDF" fonts.dir | cut -d' ' -f2- )"
+ echo "$ALIAS \"$NAME\"" >> fonts.alias
+ fi
+ )
+ fi
+}
+
+mkdir -p "$BDFDIR" || exit 1
+mkdir -p "$TTFDIR" || exit 1
+install_font 8
+install_font 16
+install_font 24
+
+cp "fonts/FauxtariScalableMono.ttf" "$TTFDIR"
+if [ "$SYSTEM" = "yes" ]; then
+ fc-cache -f "$BDFDIR" &> /dev/null
+ xset fp rehash &> /dev/null
+ if [ "$BDFDIR" != "$TTFDIR" ]; then
+ cd "$TTFDIR"
+ mkfontdir
+ mkfontscale
+ fc-cache -f "$TTFDIR" &> /dev/null
+ fi
+fi
diff --git a/int_disk_tokens.c b/int_disk_tokens.c
new file mode 100644
index 0000000..3ea0f77
--- /dev/null
+++ b/int_disk_tokens.c
@@ -0,0 +1,94 @@
+const char *int_disk_cmds[] = {
+ "REM", /* $00 */
+ "DATA", /* $01 */
+ "INPUT", /* $02 */
+ "COLOR", /* $03 */
+ "LIST", /* $04 */
+ "ENTER", /* $05 */
+ "LET", /* $06 */
+ "IF", /* $07 */
+ "FOR", /* $08 */
+ "NEXT", /* $09 */
+ "GOTO", /* $0A */
+ "GO TO", /* $0B */
+ "GOSUB", /* $0C */
+ "TRAP", /* $0D */
+ "BYE", /* $0E */
+ "CONT", /* $0F */
+ "COM", /* $10 */
+ "CLOSE", /* $11 */
+ "CLR", /* $12 */
+ "VBLANKWAIT", /* $13 */
+ "DIM", /* $14 */
+ "END", /* $15 */
+ "NEW", /* $16 */
+ "OPEN", /* $17 */
+ "LOAD", /* $18 */
+ "SAVE", /* $19 */
+ "STATUS", /* $1A */
+ "NOTE", /* $1B */
+ "POINT", /* $1C */
+ "XIO", /* $1D */
+ "ON", /* $1E */
+ "POKE", /* $1F */
+ "PRINT", /* $20 */
+ "READ", /* $21 */
+ "RESTORE", /* $22 */
+ "RETURN", /* $23 */
+ "RUN", /* $24 */
+ "STOP", /* $25 */
+ "POP", /* $26 */
+ "?", /* $27 */
+ "GET", /* $28 */
+ "PUT", /* $29 */
+ "GRAPHICS", /* $2A */
+ "PLOT", /* $2B */
+ "POSITION", /* $2C */
+ "DOS", /* $2D */
+ "DRAWTO", /* $2E */
+ "SETCOLOR", /* $2F */
+ "LOCATE", /* $30 */
+ "SOUND", /* $31 */
+ "LPRINT", /* $32 */
+ "CSAVE", /* $33 */
+ "CLOAD", /* $34 */
+ "", /* $35 */
+ "ERROR- ", /* $36 */
+ "WHILE", /* $37 */
+ "ENDWHILE", /* $38 */
+ "TRACEOFF", /* $39 */
+ "TRACE", /* $3A */
+ "ELSE", /* $3B */
+ "ENDIF", /* $3C */
+ "DPOKE", /* $3D */
+ "LOMEM", /* $3E */
+ "DEL", /* $3F */
+ "VINC", /* $40 */
+ "VDEC", /* $41 */
+ "VCONST", /* $42 */
+ "BPUT", /* $43 */
+ "BGET", /* $44 */
+ "TAB", /* $45 */
+ "CP", /* $46 */
+ "ERASE", /* $47 */
+ "PROTECT", /* $48 */
+ "UNPROTECT", /* $49 */
+ "DIR", /* $4A */
+ "RENAME", /* $4B */
+ "MOVE", /* $4C */
+ "MISSILE", /* $4D */
+ "PMCLR", /* $4E */
+ "PMCOLOR", /* $4F */
+ "PMGRAPHICS", /* $50 */
+ "PMMOVE", /* $51 */
+ "PMWIDTH", /* $52 */
+ "SET", /* $53 */
+ "LVAR", /* $54 */
+ "RENUM", /* $55 */
+ "FAST", /* $56 */
+ "NUM", /* $57 */
+ "END", /* $58 */
+};
+
+const int int_disk_cmd_size = sizeof(int_disk_cmds);
+
diff --git a/int_disk_tokens.h b/int_disk_tokens.h
new file mode 100644
index 0000000..f5059d9
--- /dev/null
+++ b/int_disk_tokens.h
@@ -0,0 +1,5 @@
+extern const char *int_disk_cmds[];
+#define int_disk_ops int_ops
+
+extern const int int_disk_cmd_size;
+#define int_disk_ops_size int_ops_size
diff --git a/int_tokens.c b/int_tokens.c
new file mode 100644
index 0000000..9875e75
--- /dev/null
+++ b/int_tokens.c
@@ -0,0 +1,189 @@
+const char *int_cmds[] = {
+ "REM", /* $00 */
+ "DATA", /* $01 */
+ "INPUT", /* $02 */
+ "COLOR", /* $03 */
+ "LIST", /* $04 */
+ "ENTER", /* $05 */
+ "LET", /* $06 */
+ "IF", /* $07 */
+ "FOR", /* $08 */
+ "NEXT", /* $09 */
+ "GOTO", /* $0A */
+ "GO TO", /* $0B */
+ "GOSUB", /* $0C */
+ "TRAP", /* $0D */
+ "BYE", /* $0E */
+ "CONT", /* $0F */
+ "COM", /* $10 */
+ "CLOSE", /* $11 */
+ "CLR", /* $12 */
+ "VBLANKWAIT", /* $13 */
+ "HITCLR", /* $14 */
+ " ", /* $15 */
+ "DIM", /* $16 */
+ "END", /* $17 */
+ "NEW", /* $18 */
+ "OPEN", /* $19 */
+ "LOAD", /* $1A */
+ "SAVE", /* $1B */
+ "STATUS", /* $1C */
+ "NOTE", /* $1D */
+ "POINT", /* $1E */
+ "XIO", /* $1F */
+ "ON", /* $20 */
+ "POKE", /* $21 */
+ "PRINT", /* $22 */
+ "READ", /* $23 */
+ "RESTORE", /* $24 */
+ "RETURN", /* $25 */
+ "RUN", /* $26 */
+ "STOP", /* $27 */
+ "POP", /* $28 */
+ "?", /* $29 */
+ "GET", /* $2A */
+ "PUT", /* $2B */
+ "GRAPHICS", /* $2C */
+ "PLOT", /* $2D */
+ "POSITION", /* $2E */
+ "DOS", /* $2F */
+ "DRAWTO", /* $30 */
+ "SETCOLOR", /* $31 */
+ "LOCATE", /* $32 */
+ "SOUND", /* $33 */
+ "LPRINT", /* $34 */
+ "CSAVE", /* $35 */
+ "CLOAD", /* $36 */
+ "", /* $37 */
+ "ERROR- ", /* $38 */
+ "WHILE", /* $39 */
+ "ENDWHILE", /* $3A */
+ "TRACEOFF", /* $3B */
+ "TRACE", /* $3C */
+ "ELSE", /* $3D */
+ "ENDIF", /* $3E */
+ "DPOKE", /* $3F */
+ "LOMEM", /* $40 */
+ "DEL", /* $41 */
+ "VINC", /* $42 */
+ "VDEC", /* $43 */
+ "VCONST", /* $44 */
+ "BPUT", /* $45 */
+ "BGET", /* $46 */
+ "TAB", /* $47 */
+ "CP", /* $48 */
+ "ERASE", /* $49 */
+ "PROTECT", /* $4A */
+ "UNPROTECT", /* $4B */
+ "DIR", /* $4C */
+ "RENAME", /* $4D */
+ "MOVE", /* $4E */
+ "MISSILE", /* $4F */
+ "PMCLR", /* $50 */
+ "PMCOLOR", /* $51 */
+ "PMGRAPHICS", /* $52 */
+ "PMMOVE", /* $53 */
+ "PMWIDTH", /* $54 */
+ "SET", /* $55 */
+ "LVAR", /* $56 */
+ "RENUM", /* $57 */
+ "FAST", /* $58 */
+ "NUM", /* $59 */
+ "END", /* $5A */
+};
+
+const int int_cmd_size = sizeof(int_cmds);
+
+const char *int_ops[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ ",", /* $10 */
+ ":", /* $11 */
+ ";", /* $12 */
+ "", /* $13 */
+ " GOTO ", /* $14 */
+ " GOSUB ", /* $15 */
+ " TO ", /* $16 */
+ " STEP ", /* $17 */
+ "=", /* $18 */
+ "=", /* $19 */
+ " THEN ", /* $1A */
+ "#", /* $1B */
+ "^&", /* $1C */
+ "^!", /* $1D */
+ "^%", /* $1E */
+ ">>", /* $1F */
+ "<<", /* $20 */
+ "<=", /* $21 */
+ "<>", /* $22 */
+ ">=", /* $23 */
+ "<", /* $24 */
+ ">", /* $25 */
+ "=", /* $26 */
+ "\\", /* $27 */
+ "*", /* $28 */
+ "+", /* $29 */
+ "-", /* $2A */
+ "/", /* $2B */
+ "%", /* $2C */
+ " NOT ", /* $2D */
+ " OR ", /* $2E */
+ " AND ", /* $2F */
+ "!", /* $30 */
+ "&", /* $31 */
+ "(", /* $32 */
+ ")", /* $33 */
+ "<=", /* $34 */
+ "<>", /* $35 */
+ ">=", /* $36 */
+ "<", /* $37 */
+ ">", /* $38 */
+ "=", /* $39 */
+ "+", /* $3A */
+ "-", /* $3B */
+ "(", /* $3C */
+ "", /* $3D */
+ "", /* $3E */
+ "(", /* $3F */
+ "(", /* $40 */
+ ",", /* $41 */
+ ";", /* $42 */
+ "LEFT$(", /* $43 */
+ "RIGHT$(", /* $44 */
+ "MID$(", /* $45 */
+ "STR$(", /* $46 */
+ "CHR$(", /* $47 */
+ "USR(", /* $48 */
+ "ASC(", /* $49 */
+ "VAL(", /* $4A */
+ "LEN(", /* $4B */
+ "ADR(", /* $4C */
+ "BUMP(", /* $4D */
+ "FIND(", /* $4E */
+ "HEX$(", /* $4F */
+ "RANDOM(", /* $50 */
+ "DPEEK(", /* $51 */
+ "RUN(", /* $52 */
+ " ", /* $53 */
+ "PEEK(", /* $54 */
+ " ", /* $55 */
+ "RND(", /* $56 */
+ "FRE(", /* $57 */
+ "SQR(", /* $58 */
+ "SGN(", /* $59 */
+ "ABS(", /* $5A */
+ "INT(", /* $5B */
+ "SYS(", /* $5C */
+ "PADDLE(", /* $5D */
+ "STICK(", /* $5E */
+ "PTRIG(", /* $5F */
+ "STRIG(", /* $60 */
+ "VSTICK(", /* $61 */
+ "HSTICK(", /* $62 */
+ "PMADR(", /* $63 */
+ "ERR(", /* $64 */
+ "TAB(", /* $65 */
+ "PEN(", /* $66 */
+};
+
+const int int_ops_size = sizeof(int_ops);
diff --git a/int_tokens.h b/int_tokens.h
new file mode 100644
index 0000000..135890e
--- /dev/null
+++ b/int_tokens.h
@@ -0,0 +1,5 @@
+extern const char *int_cmds[];
+extern const char *int_ops[];
+
+extern const int int_cmd_size;
+extern const int int_ops_size;
diff --git a/jindroush/Makefile b/jindroush/Makefile
index 0a11a8f..a4fe4c9 100644
--- a/jindroush/Makefile
+++ b/jindroush/Makefile
@@ -18,15 +18,15 @@ BINS=acvt adir aext bas2boot chkbas chkexe chkrom
W=-Wall -Wno-write-strings
all: libs manpages
- for i in $(BINS); do \
- make -C $$i COPT="$(COPT) $(W)" ; \
+ @for i in $(BINS); do \
+ $(MAKE) --no-print-directory -C $$i COPT="$(COPT) $(W)" ; \
done
manpages:
- make -C man
+ @$(MAKE) --no-print-directory -C man
libs:
- make -C lib COPT="$(COPT) $(W)"
+ @$(MAKE) --no-print-directory -C lib COPT="$(COPT) $(W)"
clean:
make -C lib clean
@@ -54,9 +54,3 @@ install: all
chmod 644 $(DESTDIR)/$(MAN1DIR)/$$i.1 ; \
[ "$(GZIP_MAN)" = "y" ] && gzip -f $(DESTDIR)/$(MAN1DIR)/$$i.1 ; \
done
- ln -sf chkbas $(DESTDIR)$(BINDIR)/listbas
- if [ "$(GZIP_MAN)" = "y" ]; then \
- ln -sf chkbas.1.gz $(DESTDIR)$(MAN1DIR)/listbas.1.gz ; \
- else \
- ln -sf chkbas.1 $(DESTDIR)$(MAN1DIR)/listbas.1 ; \
- fi
diff --git a/jindroush/README.txt b/jindroush/README.txt
index 31d9af9..a085003 100644
--- a/jindroush/README.txt
+++ b/jindroush/README.txt
@@ -29,9 +29,10 @@ I've made to Jindroush's code:
with mode 0600; changed this to 0666 (which will still be affected
by the user's umask).
-- Added "listbas" symlink, to save typing "chkbas -short" over and over
- again.
-
- adir's -dir option now creates the directory if it doesn't exist.
- Wrote man pages for all the utilities.
+
+- Fixed a bug in chkbas: BASIC XL and XE's LEFT$ RIGHT$ MID$ were
+ being printed without the left parenthesis (e.g Left$(A$,3) was
+ coming out as Left$A$,3).
diff --git a/jindroush/acvt/Makefile b/jindroush/acvt/Makefile
index 498e2fc..34f0e41 100644
--- a/jindroush/acvt/Makefile
+++ b/jindroush/acvt/Makefile
@@ -11,22 +11,18 @@ all: release
release:
@$(MAKE) $(PRGNAME) CFLAGS="-c -O2 -Wall -D__CDISK_SAVE__" LDFLAGS=""
- @echo RELEASE: Compiled.
rel_strip: release
@strip $(PRGNAME)
install: rel_strip
cp $(PRGNAME) $(DESTDIR)/$(PREFIX)/bin/
- @echo RELEASE: Installed.
debug:
@$(MAKE) $(PRGNAME) CFLAGS="-c -g -Wall -D_DEBUG -D__CDISK_SAVE__" LDFLAGS="-g"
- @echo DEBUG: Compiled.
clean:
rm -rf *.o $(PRGNAME) $(PRGNAME).exe switches.cpp
- @echo DEBUG: Cleaned.
OBJECTS = acvt.o
diff --git a/jindroush/adir/Makefile b/jindroush/adir/Makefile
index 284add5..cf025be 100644
--- a/jindroush/adir/Makefile
+++ b/jindroush/adir/Makefile
@@ -11,22 +11,18 @@ all: release
release:
@$(MAKE) $(PRGNAME) CFLAGS="-c -O2 -Wall -D__CDISK_SAVE__" LDFLAGS=""
- @echo RELEASE: Compiled.
rel_strip: release
@strip $(PRGNAME)
install: rel_strip
cp $(PRGNAME) $(DESTDIR)/$(PREFIX)/bin/
- @echo RELEASE: Installed.
debug:
@$(MAKE) $(PRGNAME) CFLAGS="-c -g -Wall -D_DEBUG -D__CDISK_SAVE__" LDFLAGS="-g"
- @echo DEBUG: Compiled.
clean:
rm -rf *.o $(PRGNAME) $(PRGNAME).exe switches.cpp
- @echo DEBUG: Cleaned.
OBJECTS = adir.o
diff --git a/jindroush/chkbas/basic_xe.h b/jindroush/chkbas/basic_xe.h
index fc86131..56e0276 100644
--- a/jindroush/chkbas/basic_xe.h
+++ b/jindroush/chkbas/basic_xe.h
@@ -209,9 +209,9 @@ char* aOpsBasicXe[] = {
"ERR", //63
"TAB", //64
"PEN", //65
- "LEFT$", //66
- "RIGHT$", //67
- "MID$", //68
+ "LEFT$(", //66
+ "RIGHT$(", //67
+ "MID$(", //68
};
#define BASICXE_CMD_NUM ( sizeof( aCmdsBasicXe ) / sizeof( aCmdsBasicXe[ 0 ] ) )
diff --git a/jindroush/chkbas/basic_xl.h b/jindroush/chkbas/basic_xl.h
index a97f8a7..97dd627 100644
--- a/jindroush/chkbas/basic_xl.h
+++ b/jindroush/chkbas/basic_xl.h
@@ -203,9 +203,9 @@ char* aOpsBasicXl[] = {
"ERR", //63
"TAB", //64
"PEN", //65
- "LEFT$", //66
- "RIGHT$", //67
- "MID$", //68
+ "LEFT$(", //66
+ "RIGHT$(", //67
+ "MID$(", //68
};
#define BASICXL_CMD_NUM ( sizeof( aCmdsBasicXl ) / sizeof( aCmdsBasicXl[ 0 ] ) )
diff --git a/jindroush/chkbas/chkbas.cpp b/jindroush/chkbas/chkbas.cpp
index a1ad505..aa6b161 100644
--- a/jindroush/chkbas/chkbas.cpp
+++ b/jindroush/chkbas/chkbas.cpp
@@ -222,7 +222,7 @@ int main( int argc, char* argv[] )
fprintf( g_fout, "Constants & pointers:\n" );
fprintf( g_fout, "Start of Name Table (VNT) : %04X\n", wVNT );
fprintf( g_fout, "End of Name Table (VNTE) : %04X\n", wVNTE );
- fprintf( g_fout, "Lenght of Name Table (VNTL) : %04X\n", wVNTL );
+ fprintf( g_fout, "Length of Name Table (VNTL) : %04X\n", wVNTL );
fprintf( g_fout, "Start of Variable Table (VVT) : %04X\n", wVVT );
fprintf( g_fout, "End of Variable Table (VVTE) : %04X\n", wVVTE );
diff --git a/jindroush/man/chkbas.1 b/jindroush/man/chkbas.1
index 1069d6c..f2664f3 100644
--- a/jindroush/man/chkbas.1
+++ b/jindroush/man/chkbas.1
@@ -27,14 +27,12 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "CHKBAS" 1 "2024-05-16" "1.10" "Jindroush's Atari 8-bit tools"
+.TH "CHKBAS" 1 "2024-07-10" "1.10" "Jindroush's Atari 8-bit tools"
.SH NAME
chkbas \- check and detokenize Atari BASIC SAVEd files
.SH SYNOPSIS
.sp
chkbas [\fB\-atari\fP] [\fB\-short\fP] [\fB\-verbose\fP] [\fB\-noinverse\fP] [\fB\-tbs\fP | \fB\-bxl\fP | \fB\-bxe\fP] \fBbasic\-file\fP [\fBoutput\-file\fP]
-.sp
-listbas [\fB\-atari\fP] [\fB\-verbose\fP] [\fB\-noinverse\fP] [\fB\-tbs\fP | \fB\-bxl\fP | \fB\-bxe\fP] \fBbasic\-file\fP [\fBoutput\-file\fP]
.SH DESCRIPTION
.sp
\fBchkbas\fP detokenizes Atari 8\-bit BASIC SAVEd files. It lists the BASIC
@@ -47,7 +45,21 @@ standard output. If \fBbasic\-file\fP is anything other than standard
Atari BASIC, the BASIC dialect must be specified (see \fBOPTIONS\fP,
below).
.sp
-\fBlistbas\fP is simply an alias for \fBchkbas \-short\fP\&.
+It\(aqs highly recommended to avoid running \fBchkbas\fP without
+redirecting or piping its output: If the program contains ATASCII
+graphics or inverse characters, they will be printed as\-is to the
+terminal, which can confuse the terminal. For simply reading the code,
+pipe to \fBa8cat\fP(1), thus:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+$ chkbas \-atari PROGRAM.BAS | a8cat
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
.sp
Sample run, with no options:
.INDENT 0.0
@@ -69,7 +81,7 @@ Input file: HELLO.BAS
Constants & pointers:
Start of Name Table (VNT) : 000E
End of Name Table (VNTE) : 0011
-Lenght of Name Table (VNTL) : 0004
+Length of Name Table (VNTL) : 0004
Start of Variable Table (VVT) : 0012
End of Variable Table (VVTE) : 0021
Length of Variable Table (VVTL) : 0010
@@ -125,7 +137,7 @@ EOL characters (\fB$9B\fP).
.B \fB\-short\fP
Output only the program listing, with lines terminated by the
system default newline character(s), e.g. \fBn\fP on UNIX\-like OSes,
-\fBrn\fP on MS\-DOS or Windows. This is the default for \fBlistbas\fP\&.
+\fBrn\fP on MS\-DOS or Windows.
.TP
.B \fB\-verbose\fP
Program listing will be interspersed with per\-line and per\-statement
diff --git a/jindroush/man/chkbas.rst b/jindroush/man/chkbas.rst
index 2f9e6b7..b6c678f 100644
--- a/jindroush/man/chkbas.rst
+++ b/jindroush/man/chkbas.rst
@@ -15,8 +15,6 @@ SYNOPSIS
chkbas [**-atari**] [**-short**] [**-verbose**] [**-noinverse**] [**-tbs** | **-bxl** | **-bxe**] **basic-file** [**output-file**]
-listbas [**-atari**] [**-verbose**] [**-noinverse**] [**-tbs** | **-bxl** | **-bxe**] **basic-file** [**output-file**]
-
DESCRIPTION
===========
@@ -30,7 +28,13 @@ standard output. If **basic-file** is anything other than standard
Atari BASIC, the BASIC dialect must be specified (see **OPTIONS**,
below).
-**listbas** is simply an alias for **chkbas -short**.
+It's highly recommended to avoid running **chkbas** without
+redirecting or piping its output: If the program contains ATASCII
+graphics or inverse characters, they will be printed as-is to the
+terminal, which can confuse the terminal. For simply reading the code,
+pipe to **a8cat**\(1), thus::
+
+ $ chkbas -atari PROGRAM.BAS | a8cat
Sample run, with no options::
@@ -48,7 +52,7 @@ Sample run, with no options::
Constants & pointers:
Start of Name Table (VNT) : 000E
End of Name Table (VNTE) : 0011
- Lenght of Name Table (VNTL) : 0004
+ Length of Name Table (VNTL) : 0004
Start of Variable Table (VVT) : 0012
End of Variable Table (VVTE) : 0021
Length of Variable Table (VVTL) : 0010
@@ -103,7 +107,7 @@ Output Options
**-short**
Output only the program listing, with lines terminated by the
system default newline character(s), e.g. **\n** on UNIX-like OSes,
- **\r\n** on MS-DOS or Windows. This is the default for **listbas**.
+ **\r\n** on MS-DOS or Windows.
**-verbose**
Program listing will be interspersed with per-line and per-statement
diff --git a/linetab.c b/linetab.c
new file mode 100644
index 0000000..55a5c97
--- /dev/null
+++ b/linetab.c
@@ -0,0 +1,199 @@
+#include "linetab.h"
+
+lineref_t *linerefs[32769];
+int refcounts[32769];
+int lines_exist[32769];
+unsigned char last_cmd, on_op;
+int last_cmd_pos;
+
+void add_lineref(unsigned short from, unsigned short pos) {
+ lineref_t *p;
+ int c;
+ unsigned short to;
+
+ to = fp2int(program + pos);
+ if(to > 32767) return;
+
+ p = linerefs[to];
+ c = refcounts[to];
+
+ if(c) {
+ p = realloc(p, sizeof(lineref_t) * (c + 1));
+ } else {
+ p = malloc(sizeof(lineref_t));
+ }
+
+ if(!p) die("Out of memory.");
+
+ linerefs[to] = p;
+ linerefs[to][c].lineno = from;
+ linerefs[to][c].pos = pos;
+ linerefs[to][c].cmd = last_cmd;
+ c++;
+ refcounts[to] = c;
+}
+
+/* makes sure a numeric constant isn't start of an expression. */
+int is_standalone_num(unsigned short pos) {
+ if(program[pos] != OP_NUMCONST) return 0;
+ switch(program[pos + 7]) {
+ case OP_EOS:
+ case OP_EOL:
+ case OP_COMMA:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+CALLBACK(start_stmt) {
+ lines_exist[lineno] = 1;
+}
+
+CALLBACK(got_cmd) {
+ last_cmd = tok;
+ last_cmd_pos = pos;
+ on_op = 0;
+}
+
+void computed_msg(unsigned short lineno) {
+ static int last_lineno = -1;
+ char *cmd;
+
+ /* avoid duplicate warnings */
+ if(lineno == last_lineno) return;
+ last_lineno = lineno;
+
+ switch(last_cmd) {
+ case CMD_GOTO:
+ cmd = "GOTO"; break;
+ case CMD_GO_TO:
+ cmd = "GO TO"; break;
+ case CMD_GOSUB:
+ cmd = "GOSUB"; break;
+ case CMD_RESTORE:
+ cmd = "RESTORE"; break;
+ case CMD_TRAP:
+ cmd = "TRAP"; break;
+ case CMD_ON:
+ if(on_op == OP_GOSUB)
+ cmd = "ON/GOSUB";
+ else
+ cmd = "ON/GOTO";
+ break;
+ case CMD_LIST:
+ cmd = "LIST";
+ break;
+ default: /* should never happen! */
+ cmd = "???"; break;
+ }
+
+ fprintf(stderr, "%s: Warning: Computed %s at line %d.\n", self, cmd, lineno);
+}
+
+CALLBACK(got_var) {
+ switch(last_cmd) {
+ /* any use of a variable in the arguments to these means
+ we can't renumber that argument. */
+ case CMD_GOTO:
+ case CMD_GO_TO:
+ case CMD_GOSUB:
+ case CMD_RESTORE:
+ case CMD_TRAP:
+ case CMD_LIST:
+ computed_msg(lineno);
+ break;
+ case CMD_ON:
+ /* vars are OK in ON, before the GOTO or GOSUB */
+ if(on_op) computed_msg(lineno);
+ break;
+ default:
+ break;
+ }
+}
+
+CALLBACK(got_exp) {
+ unsigned char last_tok = program[pos - 1];
+ int standalone;
+
+ if(last_cmd == CMD_ON) {
+ if(tok == OP_GOTO || tok == OP_GOSUB)
+ on_op = tok;
+ }
+
+ if(tok != OP_NUMCONST) return;
+
+ /* beware: standalone only means nothing *follows* the constant
+ in the same expression. still have to check last_tok to see
+ what came before. */
+ standalone = is_standalone_num(pos);
+
+ switch(last_cmd) {
+ /* these take a single argument */
+ case CMD_GOTO:
+ case CMD_GO_TO:
+ case CMD_GOSUB:
+ case CMD_RESTORE:
+ case CMD_TRAP:
+ if((pos == last_cmd_pos + 1) && standalone) {
+ add_lineref(lineno, pos + 1);
+ } else {
+ computed_msg(lineno);
+ }
+ break;
+ case CMD_IF:
+ /* this only applies to bare line numbers, like IF A THEN 1000,
+ not IF A THEN GOTO 1000 (or anything else after THEN). */
+ if(last_tok == OP_THEN) {
+ add_lineref(lineno, pos + 1);
+ }
+ break;
+ case CMD_ON: {
+ /* takes arbitrary number of arguments */
+ switch(last_tok) {
+ case OP_GOTO:
+ case OP_GOSUB:
+ case OP_COMMA:
+ if(standalone)
+ add_lineref(lineno, pos + 1);
+ else
+ computed_msg(lineno);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CMD_LIST: {
+ /* takes one or two arguments */
+ switch(last_tok) {
+ case CMD_LIST:
+ case OP_COMMA:
+ if(standalone)
+ add_lineref(lineno, pos + 1);
+ else
+ computed_msg(lineno);
+ break;
+ default:
+ break;
+ }
+ }
+ default:
+ break;
+ }
+}
+
+void build_ref_table(void) {
+ on_start_stmt = start_stmt;
+ on_cmd_token = got_cmd;
+ on_exp_token = got_exp;
+ on_var_token = got_var;
+ walk_all_code();
+ on_start_stmt = on_cmd_token = on_exp_token = on_var_token = 0;
+}
+
+void free_ref_table(void) {
+ int i;
+ for(i = 0; i < 32768; i++)
+ if(linerefs[i]) free(linerefs[i]);
+}
diff --git a/linetab.h b/linetab.h
new file mode 100644
index 0000000..e38335a
--- /dev/null
+++ b/linetab.h
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+#include "bcdfp.h"
+
+typedef struct {
+ unsigned short lineno;
+ unsigned short pos;
+ unsigned char cmd;
+} lineref_t;
+
+extern lineref_t *linerefs[];
+extern int refcounts[];
+extern int lines_exist[];
+
+extern void add_lineref(unsigned short from, unsigned short pos);
+extern void build_ref_table(void);
+extern void free_ref_table(void);
diff --git a/listamsb.1 b/listamsb.1
new file mode 100644
index 0000000..b5e2213
--- /dev/null
+++ b/listamsb.1
@@ -0,0 +1,377 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "LISTAMSB" 1 "2025-04-02" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+listamsb \- List the source of a tokenized Atari Microsoft BASIC program
+.SH SYNOPSIS
+.sp
+listamsb [\fB\-U\fP] | [\fB\-C\fP [\fB\-k\fP]] | [\fB\-D\fP] | [[\fB\-L\fP] [\fB\-a\fP] [\fB\-c\fP] [\fB\-v\fP] [\fB\-h\fP] [\fB\-i\fP] [\fB\-u\fP] [\fB\-t\fP] [\fB\-m\fP] [\fB\-M\fP] [\fB\-n\fP] [\fB\-s\fP] [\fB\-r\fP \fIline\-range\fP] ...] [\fBinput\-file\fP] [\fBoutput\-file\fP]
+.SH DESCRIPTION
+.sp
+\fBlistamsb\fP acts like the \fILIST\fP command in Atari Microsoft BASIC. It reads a
+tokenized (SAVEd) AMSB program and prints the code in human\-readable
+format.
+.sp
+\fBlistamsb\fP supports both versions of Atari Microsoft BASIC: the
+disk\-based version 1 and the cartridge\-based version 2. The language
+is the same for both versions, so there\(aqs no need to specify it.
+.sp
+\fBinput\-file\fP must be a tokenized AMSB program. If no \fBinput\-file\fP is given,
+input is read from \fBstdin\fP\&.
+.sp
+Programs created with \fISAVE "filename" LOCK\fP are autodetected,
+and will be listed normally. It\(aqs also possible to convert a LOCKed
+program to an unencrypted one, with the \fB\-U\fP option.
+.sp
+Programs can be "crunched" and "decrunched" with the \fB\-C\fP and \fB\-D\fP
+options.
+.sp
+If no \fBoutput\-file\fP is given, output is to \fBstdout\fP\&. When output
+is to a file, the file will be overwritten without prompting if it
+already exists.
+.sp
+By default, output is modern UTF\-8 equivalents of the ATASCII
+character set, with ANSI control sequences for inverse video and
+color. See the \fB\-M\fP, \fB\-a\fP, \fB\-i\fP, \fB\-u\fP, \fB\-t\fP, \fB\-m\fP, \fB\-s\fP
+options to change the output style.
+.sp
+When listing in color (when the \fB\-M\fP option is not used),
+\fBlistamsb\fP\(aqs output is piped through \fBcolorize\-amsb\fP, which must
+be available in your \fBPATH\fP\&.
+.sp
+\fBlistamsb\fP will not write binary data (ATASCII or tokenized BASIC)
+directly to a terminal, under any circumstances.
+.SH OPTIONS
+.SS Operation Modes
+.INDENT 0.0
+.TP
+.B \fB\-L\fP
+LIST program. This is the default, so there\(aqs no need to give this option
+normally. See next section for options that control the listing.
+.TP
+.B \fB\-C\fP
+"Crunch" program: remove comments and spaces that occur outside of a
+string. The resulting program is tokenized, and is usually 5 to 10
+percent smaller. It should RUN correctly, but will be difficult to
+edit in AMSB because its parser requires the spaces.
+.sp
+The crunched program will always be unLOCKed.
+.sp
+If any comment\-only lines are the target of GOTO or GOSUB, the
+program won\(aqt RUN correctly because all comment\-only lines are
+removed. If this happens, you can use the \fB\-k\fP option (see below).
+.sp
+This option must be used with an \fBoutput\-file\fP, since seeking is done.
+None of the other options have any effect with \fB\-C\fP\&.
+.TP
+.B \fB\-D\fP
+"Decrunch" a crunched program. Puts spaces where they\(aqre required for
+AMSB\(aqs parser. The resulting program is tokenized, and will be
+editable in AMSB. Of course, any comments that were removed during
+crunching will not magically be restored (they\(aqre gone).
+.sp
+The decrunched program will always be unLOCKed.
+.sp
+This option must be used with an \fBoutput\-file\fP, since seeking is done.
+None of the other options have any effect with \fB\-D\fP\&.
+.TP
+.B \fB\-U\fP
+UnLOCK or LOCK the the program. Locked programs are created with
+\fISAVE "filename" LOCK\fP\&. The "encryption" is a reciprocal cipher: locking and
+unlocking are the same operation (similar to ROT13). The output will
+be the locked or unlocked tokenized program (rather than a listing).
+.sp
+This option must be used with an \fBoutput\-file\fP, a pipe, or
+redirection: \fBlistamsb\fP will not write tokenized BASIC to a
+terminal. None of the other options have any effect with \fB\-U\fP\&.
+.UNINDENT
+.SS Options for \fB\-L\fP (list) Mode
+.sp
+None of these options have any effect when used with \fB\-C\fP, \fB\-D\fP,
+or \fB\-U\fP\&.
+.INDENT 0.0
+.TP
+.B \fB\-a\fP
+Output raw ATASCII. This option must be used with an
+\fBoutput\-file\fP, a pipe, or redirection: \fBlistamsb\fP will not write
+ATASCII to a terminal. \fBcolorize\-amsb\fP is not used, with this option.
+.TP
+.B \fB\-c\fP
+Check only. No output on \fBstdout\fP\&. Diagnostics are still printed on stderr,
+and the exit status is unchanged. It\(aqs an error to give an \fBoutput\-file\fP with
+this option.
+.TP
+.B \fB\-i\fP
+Input uses Atari XL/XE International Character Set encoding, rather than
+ATASCII graphics.
+.TP
+.B \fB\-u\fP
+Use underlining for inverse video (see \fBa8cat\fP(1) for more detail).
+.TP
+.B \fB\-t\fP
+Text mode (see \fBa8cat\fP(1) for more detail).
+.TP
+.B \fB\-m\fP
+Magazine listing mode (see \fBa8cat\fP(1) for more detail).
+.TP
+.B \fB\-s\fP
+Strip bit 7 (inverse video bit; see \fBa8cat\fP(1) for more detail).
+.TP
+.B \fB\-M\fP
+Monochrome listing: disable color syntax highlighting, meaning \fBcolorize\-amsb\fP
+is not used.
+.TP
+.B \fB\-r\fP \fIline\-range\fP
+Show only part of the listing. \fIline\-range\fP can be a single line, or
+a comma\- or hyphen\-separated pair of starting and ending line numbers (e.g. \fB100,200\fP, or
+\fB1000\-2000\fP).
+.sp
+If the start line number is omitted (e.g. \fB,100\fP), it will be treated as
+\fB0\fP (meaning, list from the beginning of the program). If the ending line
+number is omitted (e.g. \fB100,\fP), it means "list until the end of the program".
+\fB\-r,\fP or \fB\-r\-\fP is equivalent to not using the \fB\-r\fP option at all.
+.TP
+.B \fB\-n\fP
+No empty line. By default, \fBlistamsb\fP prints an empty line at the
+start of the output, to match AMSB\(aqs LIST command.
+.UNINDENT
+.SS Options for \fB\-C\fP (crunch) Mode
+.INDENT 0.0
+.TP
+.B \fB\-k\fP
+Keep comment\-only lines. Normally these are removed. If the program
+gives UNDEF\(aqD LINE ERROR, it means the target line was a comment\-only
+line that got removed. With \fB\-k\fP, these lines will be kept, although
+the actual comments won\(aqt (\fI10 REM HELLO\fP will become \fI10 REM\fP).
+.UNINDENT
+.SS Utility Options
+.INDENT 0.0
+.TP
+.B \fB\-v\fP
+Verbose output, on \fBstderr\fP\&. May be given twice for extra verbosity,
+which shows each line number, its offset, length, and end\-of\-line pointer.
+Can be used with any of the mode options (\fB\-C\fP, \fB\-D\fP, \fB\-L\fP, \fB\-U\fP).
+.TP
+.B \fB\-h\fP, \fB\-\-help\fP
+Print built\-in help and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.UNINDENT
+.SH DIAGNOSTICS
+.sp
+All error and warning messages are written to the standard error output.
+.SS Fatal errors
+.sp
+These are errors in the program header at the start of the file. They
+generally mean the input isn\(aqt actually an tokenized Atari Microsoft
+BASIC file.
+.INDENT 0.0
+.IP \(bu 2
+not an AMSB file: first byte not $00 or $01
+.sp
+Pretty self\-explanatory: if the file doesn\(aqt begin with a \fI$00\fP or
+\fI$01\fP byte, it\(aqs not a tokenized AMSB file.
+.IP \(bu 2
+not an AMSB file: too big (\fIN\fP bytes), won\(aqt fit in Atari memory
+.sp
+The file can\(aqt be a tokenized AMSB file because there was no way
+for it to be created. It must be some other kind of file that begins
+with a \fI$00\fP byte.
+.IP \(bu 2
+not an AMSB file: program size too small (\fIN\fP). Atari BASIC file?
+.sp
+The program header claims the file is 0, 1, 3, or 4 bytes long. This
+is impossible, so this isn\(aqt an AMSB file. A lot of Atari BASIC
+programs begin with three \fI$00\fP bytes, so that might be what this is.
+.IP \(bu 2
+program length is 2, no code in file (SAVE after NEW)
+.sp
+Probably, someone did a SAVE when there was no program in memory. It
+could also mean this isn\(aqt an AMSB file at all.
+.UNINDENT
+.SS Warnings
+.sp
+These are non\-fatal: \fBlistamsb\fP logs the warning to stderr, then
+continues processing.
+.INDENT 0.0
+.IP \(bu 2
+unexpected EOF, file truncated?
+.sp
+A tokenized AMSB file always ends with three null bytes (\fI$00\fP).
+This file doesn\(aqt. Probably the rest of the file is missing.
+.IP \(bu 2
+line \fIL\fP: EOL address \fIA\fP too (low|high)
+.sp
+Each line begins with the address of the next line. If the address
+is below \fI$0700\fP, it\(aqs below the minimum value of \fIMEMLO\fP, which
+is impossible. If it\(aqs above \fI$bc1f\fP, it would be in the display
+list, screen memory, or OS ROM (also impossible). File is
+corrupt, or not an AMSB file.
+.IP \(bu 2
+line \fIL\fP: EOL address \fIA\fP <= previous \fIB\fP
+.sp
+Corrupt file, or not an AMSB file.
+.IP \(bu 2
+line \fIL\fP is suspiciously long
+.sp
+The line is >128 bytes long, but less than 256. AMSB can execute
+lines of this length, but it\(aqs impossible to actually enter them
+in the editor, because a logical line can\(aqt be longer than 3
+screen lines. Possibly corrupted file.
+.IP \(bu 2
+line \fIL\fP is impossibly long
+.sp
+The line is >= 256 bytes long. AMSB will crash, if you try to
+LOAD the file. Corrupted file.
+.IP \(bu 2
+line \fIL\fP EOL address doesn\(aqt match actual line length \fIN\fP
+.sp
+Corrupt file, or not an AMSB file.
+.IP \(bu 2
+line number out of order
+.sp
+Corrupt file, or not an AMSB file.
+.IP \(bu 2
+line number out range
+.sp
+The program contains a line number that\(aqs greater than \fI63999\fP\&. How
+did that happen?
+.IP \(bu 2
+line \fIL\fP has character \fIC\fP outside of a string. maybe Atari BASIC?
+.sp
+This happens when ATASCII codes 0 to 31 (\fI$1f\fP) appear in the program.
+AMSB can create files like this, but at runtime, it\(aqs a syntax error.
+More likely, it means this is an Atari BASIC file.
+.IP \(bu 2
+program size doesn\(aqt match size in header
+.sp
+Might mean this isn\(aqt an AMSB file. If you\(aqre sure it is, it might
+be truncated, or part of the file might have been overwritten with
+\fI$00\fP bytes. It could also mean the length in the header has somehow
+gotten corrupted.
+.IP \(bu 2
+trailing garbage at end of file
+.sp
+Might mean this isn\(aqt an AMSB file. If you\(aqre sure it is, garbage
+data has somehow gotten appended to the file, after the three \fI$00\fP
+bytes that end the program. Maybe it was downloaded with a crappy
+version of XMODEM that pads the last block. The good news is,
+AMSB will just ignore the garbage when you LOAD the file, so it
+won\(aqt hurt anything.
+.IP \(bu 2
+file has \fIN\fP unknown tokens
+.sp
+Either the file is corrupt, or this is a file from some \fIother\fP variant
+of Microsoft BASIC (e.g. Commodore, AppleSoft, GW\-BASIC, TRS\-80). If
+you see this warning, you\(aqll also see \fIN\fP <unknown token \fIXX\fP>
+messages in the actual listing.
+.UNINDENT
+.SH ENVIRONMENT
+.INDENT 0.0
+.TP
+.B \fBCOLORIZE_AMSB\fP
+Path to the \fBcolorize\-amsb\fP executable. Can be the absolute path
+or just the executable (searched for in \fBPATH\fP). If not set,
+defaults to \fIcolorize\-amsb\fP\&.
+.UNINDENT
+.SH LIMITATIONS
+.sp
+\fBlistamsb\fP may behave strangely when fed something other than a
+tokenized AMSB program, at least if the first byte in the file
+is \fB$00\fP or \fB$01\fP\&. Unfortunately, tokenized Atari BASIC (and
+variants like Turbo and BASIC XL) begin with \fB$00\fP\&. Usually
+you\(aqll get this error:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+not an AMSB file: program size too small (0). Atari BASIC file?
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...but occasionally you may get a bunch of warnings and gibberish
+output instead.
+.SH EXIT STATUS
+.sp
+0 for success, 1 if there was an error reading the input (e.g. file
+not found), or 2 if the input file had errors or warnings (see
+\fBDIAGNOSTICS\fP).
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/listamsb.c b/listamsb.c
new file mode 100644
index 0000000..3815db2
--- /dev/null
+++ b/listamsb.c
@@ -0,0 +1,1010 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "atascii.h"
+#include "amsbtok.h"
+
+/* this should always be defined in <stdio.h>, but just in case... */
+#ifndef BUFSIZ
+#define BUFSIZ 4096
+#endif
+
+/* range for one-byte tokens */
+#define MIN_STD_TOK 0x80 /* END */
+#define MAX_STD_TOK 0xf8 /* < */
+
+/* range for 2nd byte of two-byte tokens (1st is always 0xff) */
+#define MIN_EXT_TOK 0xa3 /* SGN */
+#define MAX_EXT_TOK 0xc5 /* STACK */
+
+/* AMSB's tokens for "!", "'", REM. used to introduce comments */
+#define TOK_REM 0x98
+#define TOK_SQUOTE 0x9a
+#define TOK_BANG 0x9b
+
+/* various other AMSB tokens */
+#define TOK_ELSE 0x9c
+#define TOK_IF 0x97
+#define TOK_THEN 0x9d
+#define TOK_AND 0xf3
+#define TOK_OR 0xf4
+#define TOK_NOT 0xf5
+
+/* good old Atari EOL character */
+#define EOL 0x9b
+
+/* every MS BASIC I ever saw had the same line number limit. it's
+ kind of arbitrary: why not allow the full range, up to 65535? */
+#define MAX_LINENO 63999
+
+/* a program bigger than this can't possibly fit into memory,
+ even with cart-based AMSB2 and no DOS loaded. */
+#define MAX_PROGLEN 30000
+
+/* there should never be a valid line of BASIC longer than MAX_LINE_LEN
+ bytes, since there would be no way to enter it in the editor. AMSB
+ uses the standard E: device, which limits you to 3 40-column screen
+ lines, or max 120 bytes (after POKE 82,0). there *cannot* be a line
+ longer than MAX_LINE_LEN_HARD, because AMSB would crash when you
+ try to LOAD such a program. */
+#define MAX_LINE_LEN 0x80
+#define MAX_LINE_LEN_HARD 0xff
+
+/* a program whose header has a length less than MIN_PROGLEN can't be
+ a real AMSB program. EMPTY_PROGLEN is what you get if you
+ SAVE when there's no program in memory (right after boot or
+ a NEW). The minimum size for a program that actually contains
+ code seems to be 5 (for 10 PRINT) */
+#define MIN_PROGLEN 5
+#define EMPTY_PROGLEN 2
+
+/* a file shorter than this can't be an AMSB program */
+#define MIN_BYTES 5
+
+/* an EOL address below this has to be an error, since
+ this is the lowest MEMLO can ever be. */
+#define MIN_PTR 0x0700
+
+/* an EOL address higher than this has to be an error, since
+ it would overlap the GR.0 display list or the ROMs at $c000 */
+#define MAX_PTR 0xbc1f
+
+/* SAVE "filename" LOCK does 'encryption' by subtracting every byte
+ from this (except the 3-byte header) */
+#define UNLOCK_KEY 0x54
+
+#define ENV_VAR "COLORIZE_AMSB"
+
+const char *self;
+
+atascii_ctx actx;
+
+int verbosity = 0; /* -v */
+int raw_output = 0; /* -a */
+int check_only = 0; /* -c */
+int startline = 0; /* -r */
+int endline = 65536; /* -r */
+int unlock_mode = 0; /* -l */
+int initial_eol = 1; /* -n */
+int crunch = 0; /* -C, -D */
+int decrunch = 0; /* -D */
+int keep_rems = 0; /* -k */
+int color = 1; /* -m */
+
+int locked = 0;
+int need_pclose = 0;
+int bytes_read = 0;
+int warnings = 0;
+int proglen = 0;
+int linecount = 0;
+int header_read = 0;
+int printing = 0;
+int spacecount = 0;
+
+FILE *infile;
+FILE *outfile;
+
+const char *outname = NULL;
+
+void verbose(int level, const char *fmt, ...) {
+ va_list ap;
+
+ if(verbosity < level) return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fputc('\n', stderr);
+}
+
+void finish(int rv);
+
+#define VA_FUNC(func, prefix, action) \
+ void func(const char *fmt, ...) { \
+ va_list ap; \
+ va_start(ap, fmt); \
+ fprintf(stderr, "%s: %s: ", self, prefix); \
+ vfprintf(stderr, fmt, ap); \
+ va_end(ap); \
+ fputc('\n', stderr); \
+ action; \
+ }
+
+VA_FUNC(die, "error", finish(2));
+VA_FUNC(os_err, "fatal", exit(1));
+VA_FUNC(warn, "warning", warnings++);
+
+void set_self(const char *argv0) {
+ char *p;
+
+ self = argv0;
+ p = strrchr(self, '/');
+ if(p) self = p + 1;
+}
+
+const char *plural(int count) {
+ return count == 1 ? "" : "s";
+}
+
+int is_comment_start(unsigned char tok) {
+ return (tok == TOK_REM || tok == TOK_SQUOTE || tok == TOK_BANG);
+}
+
+off_t get_file_len(const char *name) {
+ struct stat st;
+ if(stat(name, &st) != 0) return 0;
+ return st.st_size;
+}
+
+/* post-processing: print "summary", exit. called by either die()
+ or main() (on normal exit). */
+void finish(int rv) {
+ int progsize;
+
+ verbose(1, "read %d bytes", bytes_read);
+ verbose(1, "listed %d line%s", linecount, plural(linecount));
+
+ if(header_read) {
+ if(!linecount) warn("no lines of code in program");
+ progsize = bytes_read - 3;
+ if(proglen == progsize) {
+ verbose(1, "file size matches proglen");
+ } else {
+ warn("program size %d doesn't match size %d in header,",
+ progsize, proglen);
+ fputs(" ", stderr);
+ if(proglen > progsize) {
+ fputs("AMSB will give #136 ERROR and fail to LOAD this file\n", stderr);
+ } else {
+ fputs("AMSB will stop LOADing before the end of this file\n", stderr);
+ }
+ }
+ if(fgetc(infile) != EOF) warn("trailing garbage at end of file");
+ } else {
+ if(feof(infile))
+ warn("file is %d byte%s, too short to be an AMSB program", bytes_read, plural(bytes_read));
+ }
+
+ if(warnings) {
+ fprintf(stderr, "%s: file has %d warning%s\n",
+ self, warnings, plural(warnings));
+ rv = 2;
+ }
+
+ if(need_pclose) {
+ int got = pclose(outfile);
+ verbose(1, "return value from pipe is %d", got);
+ if(got != 0) {
+ os_err("colorize-amsb child process failed, do you have it on your PATH?");
+ }
+ } else {
+ fclose(outfile);
+ /* if we were writing to actual file and no data was written, rm it */
+ if(outname && get_file_len(outname) == 0)
+ unlink(outname);
+ }
+
+ verbose(2, "spaces outside strings/comments: %d (%.1f%%)",
+ spacecount,
+ (float)(spacecount) / (float)(bytes_read) * 100.0);
+
+ verbose(1, "exit status: %d (%s)", rv, (rv ? "ERROR" : "OK"));
+
+ exit(rv);
+}
+
+unsigned char read_byte(void) {
+ int c;
+
+ c = fgetc(infile);
+
+ if(c < 0) die("unexpected EOF in %s (byte %d), file truncated?",
+ (header_read ? "program" : "header"), bytes_read);
+
+ bytes_read++;
+ return (unsigned char)c;
+}
+
+/* "decrypt" a byte from a "SAVE x LOCK" program. */
+unsigned char unlock_byte(unsigned char b) {
+ return ((UNLOCK_KEY - b) & 0xff);
+}
+
+/* the "encryption" is the same (process is reciprocal) */
+#define lock_byte(x) unlock_byte(x)
+
+/* read and (if needed) decrypt a byte from the program. */
+unsigned char read_prog_byte(void) {
+ unsigned char b = read_byte();
+ return locked ? unlock_byte(b) : b;
+}
+
+/* read a word from the program, does not decrypt */
+int read_word(void) {
+ int w;
+
+ w = read_byte();
+ w |= (read_byte() << 8);
+
+ return w;
+}
+
+/* read and (if needed) decrypt a word from the program. */
+int read_prog_word(void) {
+ int w;
+
+ w = read_prog_byte();
+ w |= (read_prog_byte() << 8);
+
+ return w;
+}
+
+void read_header(void) {
+ /* $00 for plain, $01 for SAVE with LOCK */
+ locked = read_byte();
+ if(locked > 1) die("not an AMSB file: first byte is $%02x, not $00 or $01", locked);
+
+ if(locked)
+ verbose(1, "program is locked, decrypting");
+ else
+ verbose(1, "program is not locked");
+
+ proglen = read_word();
+
+ verbose(1, "proglen == %d (%04x)", proglen, proglen);
+
+ if(proglen > MAX_PROGLEN) {
+ die("not an AMSB file: too big (%d bytes), won't fit in Atari memory", proglen);
+ }
+
+ if(proglen == EMPTY_PROGLEN) {
+ warn("program length is 2, no code in file (SAVE after NEW)");
+ } else {
+ if(proglen < MIN_PROGLEN) {
+ die("not an AMSB file: program size too small (%d). Atari BASIC file?", proglen);
+ }
+ }
+
+ header_read = 1;
+}
+
+void unknown_token(int tok) {
+ int ext;
+ if(!printing) return;
+ ext = (tok > 0xff);
+ tok &= 0xff;
+ fprintf(outfile, "<unknown %stoken ", (ext ? "extended " : ""));
+ fprintf(outfile, "%s%02x>", (ext ? "$ff ": ""), tok);
+}
+
+void list_char(unsigned char c) {
+ if(!printing) return;
+ if(raw_output) {
+ fputc(c, outfile);
+ } else {
+ char buf[20];
+ fputs(atascii_a2utf(&actx, c, buf), outfile);
+ }
+}
+
+int expand_token(int t, unsigned char *buf);
+
+int list_token(int tok) {
+ unsigned char text[10];
+ if(!expand_token(tok, text)) {
+ unknown_token(tok);
+ return 0;
+ }
+ if(printing) fputs((char *)text, outfile);
+ return 1;
+}
+
+void list_lineno(int l) {
+ /* note that AMSB always puts a space after the line number in LIST */
+ if(printing) fprintf(outfile, "%d ", l);
+}
+
+void start_listing(void) {
+ /* AMSB always prints a blank line when it LISTs, so we do, too.
+ unless it's disabled with -n, of course. */
+ if(initial_eol) {
+ if(raw_output) {
+ fputc(0x9b, outfile);
+ } else {
+ fputc('\n', outfile);
+ }
+ }
+}
+
+int read_token(int literal);
+
+/* meat and potatoes. does the actual detokenizing. gets called once
+ per line of code. returns false when it hits the last line, or
+ true if there are more lines. */
+int next_line(void) {
+ static int last_lineno = -1;
+ static int last_ptr = -1;
+ int tok, ptr, lineno, was_colon = 0, in_string = 0, in_comment = 0, offset, len;
+
+ offset = bytes_read;
+
+ /* pointer to last token on the line, offset by whatever MEMLO
+ happened to be when the file was SAVEd. 0 means this is the
+ last line. */
+ ptr = read_prog_word();
+ if(!ptr) {
+ verbose(1, "end of program");
+ return 0;
+ }
+
+ lineno = read_prog_word();
+ verbose(2, "found line %d, offset %d, end-of-line %d", lineno, offset, ptr);
+
+ printing = (lineno >= startline) && (lineno <= endline);
+
+ if(ptr < MIN_PTR) {
+ warn("line %d: EOL address $%04x too low (<$%04x)", lineno, ptr, MIN_PTR);
+ } else if(ptr >= MAX_PTR) {
+ warn("line %d: EOL address $%04x too high (>$%04x)", lineno, ptr, MAX_PTR);
+ }
+
+ if(last_ptr != -1) {
+ if(ptr <= last_ptr) {
+ warn("line %d: EOL address $%04x <= previous $%04x", lineno, ptr, last_ptr);
+ }
+ }
+
+ if(lineno <= last_lineno) {
+ warn("line number out of order (%d <= %d)", lineno, last_lineno);
+ }
+
+ if(lineno > MAX_LINENO) {
+ warn("line number out range (%d > %d)", lineno, MAX_LINENO);
+ }
+
+ last_lineno = lineno;
+
+ list_lineno(lineno);
+
+ /* walk and print the tokens. when we hit a null byte, break out of the
+ loop, we're done with this line. */
+ while(1) {
+ tok = read_token(in_string || in_comment);
+
+ if(in_string) {
+ if(tok == 0x00) {
+ /* null byte ends both the string and the line of code.
+ don't print a closing quote because AMSB doesn't. */
+ break;
+ } else if(tok == '|') {
+ /* pipe is how AMSB stores the closing quote. end the string
+ but not the line of code, and print a " character. */
+ in_string = 0;
+ list_char('"');
+ } else {
+ /* normal string character. */
+ list_char(tok);
+ /* one " character embedded in a string gets printed as "" */
+ if(tok == '"') list_char(tok);
+ }
+ continue;
+ } else if(in_comment) {
+ /* null byte ends both the comment and the line of code. */
+ if(tok == 0x00) break;
+ list_char(tok);
+ continue;
+ }
+
+ if(was_colon) {
+ if(tok != TOK_SQUOTE && tok != TOK_BANG && tok != TOK_ELSE) {
+ list_char(':');
+ }
+ was_colon = 0;
+ }
+
+ if(tok == ':') {
+ /* statement separator. don't print the colon yet, the next token
+ might be ELSE or a ! or ' for a comment */
+ was_colon = 1;
+ } else if(tok == '"') {
+ /* begin string. strings start but *don't end* with a double-quote */
+ in_string = 1;
+ list_char(tok);
+ } else if(tok >= 0x80) {
+ if(!list_token(tok))
+ warn("unknown %stoken %s$%02x at line %d",
+ (tok > 0xff ? "extended " : ""),
+ (tok > 0xff ? "$ff " : ""),
+ tok & 0xff,
+ lineno);
+ if(is_comment_start(tok)) in_comment = 1;
+ } else {
+ /* null byte means the line of code is done */
+ if(!tok) break;
+ if(tok < 0x20) {
+ /* ATASCII graphics outside of a string */
+ warn("line %d has character %d outside of a string, maybe Atari BASIC?",
+ lineno, tok);
+ }
+ if(tok == ' ') spacecount++;
+ list_char(tok);
+ }
+ }
+
+ len = bytes_read - offset;
+
+ verbose(2, " line %d length: %d", lineno, len);
+
+ if(len > MAX_LINE_LEN) {
+ int hard = len > MAX_LINE_LEN_HARD;
+ warn("line %d is %s long (length %d > %d)",
+ lineno,
+ hard ? "impossibly" : "supiciously",
+ len,
+ hard ? MAX_LINE_LEN_HARD : MAX_LINE_LEN);
+ }
+
+ if(last_ptr != -1) {
+ int plen = ptr - last_ptr;
+ if(len != plen) {
+ warn("line %d: EOL address doesn't match actual line length %d (should be %d)", lineno, len, plen);
+ }
+ }
+
+ last_ptr = ptr;
+
+ list_char(EOL);
+
+ if(!raw_output && (actx.inv)) {
+ char buf[20];
+ fputs(atascii_a2utf(&actx, ATA_CHR_FINISH, buf), outfile);
+ }
+
+ return 1;
+}
+
+/* when this gets called, input and output are open, read_header()
+ has already run. "locking" and "unlocking" are the same
+ transform, so this function does both.
+ note that *no* checking of the program code is done here, so
+ there's no need to finish() afterwards. */
+void unlock_program(void) {
+ int c;
+
+ /* do not convert this to warn() (it ain't a warning) */
+ fprintf(stderr, "%s: program is %slocked, output will be %slocked\n",
+ self, locked ? "" : "un", locked ? "un" : "");
+
+ /* 3-byte header: 0 for unlocked, 1 for locked */
+ fputc(!locked, outfile);
+ /* LSB of program length (not encrypted) */
+ fputc(proglen & 0xff, outfile);
+ /* MSB */
+ fputc((proglen >> 8) & 0xff, outfile);
+
+ /* rest of file, including trailing nulls, is transformed */
+ while( (c = fgetc(infile)) >= 0)
+ fputc(unlock_byte(c & 0xff), outfile);
+
+ fclose(outfile);
+ exit(0);
+}
+
+void write_code(int addr, int lineno, const unsigned char *code) {
+ fputc(addr & 0xff, outfile);
+ fputc((addr >> 8) & 0xff, outfile);
+ fputc(lineno & 0xff, outfile);
+ fputc((lineno >> 8) & 0xff, outfile);
+ fputs((char *)code, outfile);
+ fputc(0x00, outfile);
+}
+
+int comment_only_line(const unsigned char *code) {
+ if(code[0] == TOK_REM) return 1;
+ if(code[0] == ':') {
+ if(code[1] == TOK_SQUOTE || code[1] == TOK_BANG)
+ return 1;
+ }
+ return 0;
+}
+
+int crunch_line(void) {
+ unsigned char code[MAX_LINE_LEN_HARD + 1], byte;
+ int lineno, ptr, codelen = 0, in_string = 0, in_comment = 0, commentstart = 0;
+ static int addr = 0x700; /* doesn't really matter where */
+
+ ptr = read_prog_word();
+ if(!ptr) return -1;
+ lineno = read_prog_word();
+
+ verbose(2, "crunching line %d", lineno);
+
+ while(1) {
+ if(codelen >= MAX_LINE_LEN_HARD)
+ die("line %d too long, crunching failed", lineno);
+ byte = read_prog_byte();
+
+ if(byte != 0) {
+ if(in_string) {
+ if(byte == '|')
+ in_string = 0;
+ } else if(in_comment) {
+ continue;
+ } else {
+ if(byte == '"')
+ in_string = 1;
+ else if(is_comment_start(byte)) {
+ in_comment = 1;
+ commentstart = codelen;
+ }
+ else if(byte == ' ')
+ continue;
+ }
+ }
+
+ code[codelen++] = byte;
+ if(byte == 0) break;
+ }
+
+ /* omit comment-only lines */
+ if(!keep_rems) {
+ if(comment_only_line(code)) {
+ verbose(1, "removing comment-only line %d", lineno);
+ return 0;
+ }
+ }
+
+ /* omit trailing comments */
+ if(commentstart > 1) {
+ code[commentstart - 1] = 0; /* null out the colon before the comment */
+ codelen = commentstart;
+
+ /* removing the comment from this: 10 PRINT :! BLAH
+ ...leaves a trailing colon. get rid of it if needed. */
+ if(codelen >= 2) {
+ if(code[codelen - 2] == ':') {
+ code[codelen - 2] = 0;
+ codelen--;
+ }
+ }
+ }
+
+ codelen += 4; /* account for ptr and lineno */
+ addr += codelen;
+
+ write_code(addr, lineno, code);
+
+ return codelen;
+}
+
+int expand_token(int t, unsigned char *buf) {
+ const char *result;
+
+ if(t < 0x80) {
+ buf[0] = t;
+ buf[1] = 0;
+ return 1;
+ }
+
+ if(t > 0xff) {
+ t &= 0xff;
+ if(t > MAX_EXT_TOK)
+ return 0;
+ result = ext_tokens[t - MIN_EXT_TOK];
+ } else {
+ if(t > MAX_STD_TOK)
+ return 0;
+ result = std_tokens[t - MIN_STD_TOK];
+ }
+
+ strcpy((char *)buf, result);
+ return 1;
+}
+
+int read_token(int literal) {
+ int tok = read_prog_byte();
+ if(literal) return tok;
+ if(tok == 0xff) {
+ tok <<= 8;
+ tok |= read_prog_byte();
+ }
+ return tok;
+}
+
+int token_is_extended(int tok) {
+ return tok > 0xff;
+}
+
+int append_token(int tok, unsigned char *buf, int len) {
+ if(token_is_extended(tok)) {
+ buf[len++] = 0xff;
+ buf[len++] = tok & 0xff;
+ } else {
+ buf[len++] = tok;
+ }
+ return len;
+}
+
+/* only called during decrunching.
+ the tokenizer in AMSB requires spaces to separate keywords
+ and variables/numbers. "IF A THEN 100" really needs the spaces
+ before and after the A, for example. */
+int need_space_between(int t1, int t2) {
+ unsigned char text1[10], text2[10];
+ unsigned char t1last, t2first;
+
+ if(!t1) return 0; /* start of line */
+ if(!t2) return 0; /* end of line */
+ if(t1 < 0x80 && t2 < 0x80) return 0; /* 2 ASCII chars */
+
+ if( !(expand_token(t1, text1) && expand_token(t2, text2)) )
+ die("invalid token in program, decrunching failed");
+
+ t1last = text1[strlen((char *)text1) - 1]; /* "PRINT" => "T" */
+ t2first = text2[0]; /* "PRINT" => "P" */
+
+ /* if we already have a space, don't need to add another */
+ if(t1last == ' ' || t2first == ' ') return 0;
+
+ /* IF, THEN, and operators like AND/OR/NOT always get a
+ space after them, for readability. */
+ switch(t1) {
+ case TOK_IF:
+ case TOK_THEN:
+ case TOK_ELSE:
+ case TOK_AND:
+ case TOK_OR:
+ case TOK_NOT:
+ return 1;
+ default: break;
+ }
+
+ /* these always get a space before them, for readability. */
+ switch(t2) {
+ case TOK_THEN:
+ case TOK_AND:
+ case TOK_OR:
+ case TOK_NOT:
+ return 1;
+ default: break;
+ }
+
+ if(t1 >= 0x80 && isalnum(t1last)) {
+ /* space not really required between OPEN/PRINT/CLOSE and #,
+ but put one there for neatness. */
+ if(t2first == '#') return 1;
+ /* same for POKE &52,0 or DATA &FF */
+ if(t2first == '&') return 1;
+ /* INPUT "PROMPT";A$ or DATA "FOO" */
+ if(t2first == '"') return 1;
+ }
+
+ /* space not really required between a closing quote and
+ a keyword, but put it in for neatness. examples:
+ OPEN #1,"D:X" INPUT
+ IF A$="FOO" THEN 10
+ PRINT "YOUR IQ IS" IQ
+ these look weird without the space after the " */
+ if(isalnum(t2first)) {
+ if(t1last == '|') return 1;
+ if(t1last == '$') return 1; /* OPEN #1,F$ OUTPUT */
+ }
+
+ return(isalnum(t1last) && isalnum(t2first));
+}
+
+int decrunch_line(void) {
+ unsigned char code[MAX_LINE_LEN_HARD + 10];
+ int lineno, tok = 0, prev, ptr, codelen = 0, in_string = 0, in_comment = 0;
+ static int addr = 0x700; /* doesn't really matter where */
+
+ ptr = read_prog_word();
+ if(!ptr) return -1;
+ lineno = read_prog_word();
+
+ verbose(2, "decrunching line %d", lineno);
+
+ while(1) {
+ if(codelen >= MAX_LINE_LEN_HARD)
+ die("line %d too long, decrunching failed", lineno);
+ prev = tok;
+ tok = read_token(in_string || in_comment);
+
+ if(tok != 0) {
+ if(in_string) {
+ if(tok == '|')
+ in_string = 0;
+ } else if(in_comment) {
+ /* NOP */
+ } else {
+ if(tok == ' ' || is_comment_start(tok)) {
+ verbose(1, "found space/comment at line %d", lineno);
+ spacecount++;
+ }
+ if(tok == '"') {
+ in_string = 1;
+ if(need_space_between(prev, tok))
+ code[codelen++] = ' ';
+ } else if(is_comment_start(tok)) {
+ in_comment = 1;
+ } else if(prev == ':' && tok == TOK_ELSE) {
+ /* special case, ELSE needs a space before the (invisible)
+ colon that comes before it. */
+ code[codelen - 1] = ' ';
+ code[codelen++] = prev;
+ } else if(need_space_between(prev, tok)) {
+ code[codelen++] = ' ';
+ }
+ }
+ }
+
+ codelen = append_token(tok, code, codelen);
+ if(tok == 0) break;
+ }
+
+ codelen += 4; /* account for ptr and lineno */
+ addr += codelen;
+
+ write_code(addr, lineno, code);
+
+ return codelen;
+}
+
+/* despite the name, this handles both crunching and decrunching */
+void crunch_program(void) {
+ int newproglen = 0, linelen = 0;
+ float percent;
+
+ fputc(0x00, outfile); /* signature (0 = not locked) */
+ fputc(0x00, outfile); /* length LSB (fill in later) */
+ fputc(0x00, outfile); /* length MSB " " */
+
+ while((linelen = decrunch ? decrunch_line() : crunch_line()) != -1)
+ newproglen += linelen;
+
+ /* trailing $00 $00 */
+ fputc(0x00, outfile);
+ fputc(0x00, outfile);
+
+ /* fill in length in header */
+ if(fseek(outfile, 1L, SEEK_SET) < 0) os_err("fseek() failed");
+ newproglen += 2; /* account for trailing $00 $00 */
+ fputc(newproglen & 0xff, outfile);
+ fputc((newproglen >> 8) & 0xff, outfile);
+ fclose(outfile);
+
+ /* show the user how the size changed */
+ newproglen += 3;
+ percent = 100.0 * (1.0 - (float)newproglen / (float)bytes_read);
+ verbose(1, "%scrunched %d byte program to %d bytes (%.1f%% %s)",
+ decrunch ? "de" : "",
+ bytes_read,
+ newproglen,
+ percent < 0 ? -percent : percent,
+ percent < 0 ? "larger" : "smaller");
+
+ if(decrunch && spacecount)
+ warn("%d spaces/comments, are you sure it was crunched?", spacecount);
+}
+
+void print_help(void) {
+ printf("%s v" VERSION " - detokenize Atari Microsoft BASIC files\n", self);
+ puts("By B. Watson <urchlay@slackware.uk>, released under the WTFPL");
+ printf("Usage: %s [[-[acCDUMnviutms] ...] [-r *start,end*]] <file> <outfile>\n", self);
+ puts(" -a: raw ATASCII output");
+ puts(" -c: check only (no listing)");
+ puts(" -C: crunch program");
+ puts(" -D: decrunch program");
+ puts(" -U: lock or unlock program");
+ puts(" -M: monochrome listing (no colorization)");
+ puts(" -n: no blank line at start of listing");
+ puts(" -v: verbosity");
+ puts(" -r: only list lines numbered from *start* to *end*");
+ puts(" --help, -h: print this help and exit");
+ puts(" --version: print version number and exit");
+ puts(" -i -u -t -m -s: same as a8cat (try 'a8cat -h')");
+ puts("file must be a tokenized (SAVEd) AMSB file. if not given, reads from stdin.");
+ puts("if outfile not given, writes to stdout");
+}
+
+void version(void) {
+ printf("%s " VERSION "\n", self);
+}
+
+void get_line_range(const char *arg) {
+ int val = 0, comma = 0;
+ const char *p = arg;
+
+ while(*p) {
+ if(*p >= '0' && *p <= '9') {
+ val *= 10;
+ val += *p - '0';
+ if(val > MAX_LINENO) {
+ os_err("invalid line number for -r (range is 0-%d)", MAX_LINENO);
+ }
+ } else if(*p == ',' || *p == '-') {
+ if(comma) os_err("invalid argument for -r (too many commas)");
+ comma++;
+ startline = val;
+ val = 0;
+ } else {
+ if(comma) os_err("invalid argument for -r (only digits and comma allowed)");
+ }
+ p++;
+ }
+
+ if(comma)
+ endline = val ? val : MAX_LINENO;
+ else
+ startline = endline = val;
+
+ if(endline < startline)
+ os_err("invalid argument for -r (start > end)");
+}
+
+void parse_args(int argc, char **argv) {
+ int opt, ropt = 0;
+ int ata_mode = ATA_MODE_UTF8, ata_flags = ATA_FLAG_NONE, a8catopt = 0;
+
+ if(argc >= 2) {
+ if(strcmp(argv[1], "--help") == 0) {
+ print_help();
+ exit(0);
+ } else if(strcmp(argv[1], "--version") == 0) {
+ version();
+ exit(0);
+ }
+ }
+
+ while( (opt = getopt(argc, argv, "MDCnLUlr:cvaiutmshk")) != -1) {
+ switch(opt) {
+ case 'L': crunch = decrunch = unlock_mode = 0; break;
+ case 'D': decrunch = 1; break;
+ case 'C': crunch = 1; break;
+ case 'l':
+ case 'U': unlock_mode = 1; break;
+ case 'k': keep_rems = 1; break;
+ case 'c': check_only = 1; break;
+ case 'a': raw_output = 1; break;
+ case 'v': verbosity++ ; break;
+ case 'n': initial_eol = 0; break;
+ case 'M': color = 0; break;
+ case 'h': print_help(); exit(0);
+ case 'r': get_line_range(optarg); ropt++; break;
+ case 'i': ata_flags |= ATA_FLAG_ICS; a8catopt++; break;
+ case 'u': ata_flags |= ATA_FLAG_UNDERLINE; a8catopt++; break;
+ case 't': ata_flags |= ATA_FLAG_ICS; a8catopt++; break;
+ case 'm': ata_mode = ATA_MODE_MAGAZINE; a8catopt++; break;
+ case 's': ata_flags |= ATA_FLAG_STRIP_INVERSE; a8catopt++; break;
+ default: print_help(); exit(1);
+ }
+ }
+
+ if((unlock_mode + crunch + decrunch) > 1) {
+ os_err("only one of -C, -D, -L, -U may be used");
+ }
+
+ if(keep_rems && !decrunch) {
+ warn("-k option ignored since -D not given");
+ }
+
+ if(unlock_mode || crunch || decrunch) {
+ if(!initial_eol || check_only || raw_output || ropt || a8catopt || !color) {
+ warn("-[acimMnrstu] options ignored with -U, -C, or -D");
+ }
+ } else if(!raw_output) {
+ atascii_context_init(&actx, ata_mode, ata_flags);
+ }
+
+ if(optind >= argc) {
+ if(isatty(fileno(stdin))) {
+ print_help();
+ os_err("can't read binary data from a terminal");
+ }
+ freopen(NULL, "rb", stdin);
+ infile = stdin;
+ } else {
+ infile = fopen(argv[optind], "rb");
+ if(!infile) {
+ os_err("%s: %s", argv[optind], strerror(errno));
+ }
+ }
+
+ optind++;
+ if(optind < argc) {
+ /* we were passed an output file */
+ outname = argv[optind];
+ if(check_only)
+ os_err("can't use output filename %s with -c", outname);
+ if(!freopen(outname, "wb", stdout))
+ os_err("%s: %s", outname, strerror(errno));
+ verbose(1, "redirected stdout to %s", outname);
+ } else if(crunch || decrunch) {
+ os_err("can't use stdout with -%c, must give an output filename",
+ crunch ? 'C' : 'D');
+ }
+}
+
+void open_output() {
+ if(check_only) {
+ outfile = freopen("/dev/null", "wb", stdout);
+ if(!outfile) {
+ os_err("/dev/null: %s", strerror(errno));
+ }
+ verbose(1, "using /dev/null for output (check_only)");
+ } else if(raw_output || unlock_mode || crunch || decrunch) {
+ if(isatty(fileno(stdout))) {
+ os_err("refusing to write %s to a terminal",
+ (raw_output ? "raw ATASCII" : "tokenized BASIC"));
+ }
+ outfile = stdout;
+ verbose(1, "using stdout for output");
+ } else {
+ if(color) {
+ char *exe = getenv(ENV_VAR);
+ if(!exe) exe = "colorize-amsb";
+ verbose(1, "using pipe for output: %s", exe);
+ outfile = popen(exe, "w"); /* "wb" not allowed! */
+ /* we probably never see this error. popen() fails only if
+ we feed it an invalid mode, or if fork() or pipe() fails,
+ or I suppose if some idjit has done a "rm -f /bin/sh"...
+ all other errors are caught at pclose(). */
+ if(!outfile) os_err("|%s: %s", exe, strerror(errno));
+ need_pclose = 1;
+ } else {
+ outfile = stdout;
+ }
+ }
+}
+
+int main(int argc, char **argv) {
+ set_self(argv[0]);
+
+ parse_args(argc, argv);
+
+ open_output();
+
+ read_header();
+
+ if(unlock_mode) {
+ unlock_program();
+ exit(0); /* don't need finish() here, no parsing done */
+ } else if(crunch || decrunch) {
+ crunch_program();
+ exit(0);
+ }
+
+ start_listing();
+
+ while(next_line())
+ linecount++;
+
+ finish(0);
+ return 0; /* never executes; shuts up gcc warning */
+}
diff --git a/listamsb.rst b/listamsb.rst
new file mode 100644
index 0000000..5bb5640
--- /dev/null
+++ b/listamsb.rst
@@ -0,0 +1,313 @@
+========
+listamsb
+========
+
+------------------------------------------------------------
+List the source of a tokenized Atari Microsoft BASIC program
+------------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+listamsb [**-U**] | [**-C** [**-k**]] | [**-D**] | [[**-L**] [**-a**] [**-c**] [**-v**] [**-h**] [**-i**] [**-u**] [**-t**] [**-m**] [**-M**] [**-n**] [**-s**] [**-r** *line-range*] ...] [**input-file**] [**output-file**]
+
+DESCRIPTION
+===========
+
+**listamsb** acts like the *LIST* command in Atari Microsoft BASIC. It reads a
+tokenized (SAVEd) AMSB program and prints the code in human-readable
+format.
+
+**listamsb** supports both versions of Atari Microsoft BASIC: the
+disk-based version 1 and the cartridge-based version 2. The language
+is the same for both versions, so there's no need to specify it.
+
+**input-file** must be a tokenized AMSB program. If no **input-file** is given,
+input is read from **stdin**.
+
+Programs created with *SAVE "filename" LOCK* are autodetected,
+and will be listed normally. It's also possible to convert a LOCKed
+program to an unencrypted one, with the **-U** option.
+
+Programs can be "crunched" and "decrunched" with the **-C** and **-D**
+options.
+
+If no **output-file** is given, output is to **stdout**. When output
+is to a file, the file will be overwritten without prompting if it
+already exists.
+
+By default, output is modern UTF-8 equivalents of the ATASCII
+character set, with ANSI control sequences for inverse video and
+color. See the **-M**, **-a**, **-i**, **-u**, **-t**, **-m**, **-s**
+options to change the output style.
+
+When listing in color (when the **-M** option is not used),
+**listamsb**\'s output is piped through **colorize-amsb**, which must
+be available in your **PATH**\.
+
+**listamsb** will not write binary data (ATASCII or tokenized BASIC)
+directly to a terminal, under any circumstances.
+
+OPTIONS
+=======
+
+Operation Modes
+---------------
+
+**-L**
+ LIST program. This is the default, so there's no need to give this option
+ normally. See next section for options that control the listing.
+
+**-C**
+ "Crunch" program: remove comments and spaces that occur outside of a
+ string. The resulting program is tokenized, and is usually 5 to 10
+ percent smaller. It should RUN correctly, but will be difficult to
+ edit in AMSB because its parser requires the spaces.
+
+ The crunched program will always be unLOCKed.
+
+ If any comment-only lines are the target of GOTO or GOSUB, the
+ program won't RUN correctly because all comment-only lines are
+ removed. If this happens, you can use the **-k** option (see below).
+
+ This option must be used with an **output-file**, since seeking is done.
+ None of the other options have any effect with **-C**.
+
+**-D**
+ "Decrunch" a crunched program. Puts spaces where they're required for
+ AMSB's parser. The resulting program is tokenized, and will be
+ editable in AMSB. Of course, any comments that were removed during
+ crunching will not magically be restored (they're gone).
+
+ The decrunched program will always be unLOCKed.
+
+ This option must be used with an **output-file**, since seeking is done.
+ None of the other options have any effect with **-D**.
+
+**-U**
+ UnLOCK or LOCK the the program. Locked programs are created with
+ *SAVE "filename" LOCK*. The "encryption" is a reciprocal cipher: locking and
+ unlocking are the same operation (similar to ROT13). The output will
+ be the locked or unlocked tokenized program (rather than a listing).
+
+ This option must be used with an **output-file**, a pipe, or
+ redirection: **listamsb** will not write tokenized BASIC to a
+ terminal. None of the other options have any effect with **-U**.
+
+Options for **-L** (list) Mode
+------------------------------
+
+None of these options have any effect when used with **-C**, **-D**,
+or **-U**.
+
+**-a**
+ Output raw ATASCII. This option must be used with an
+ **output-file**, a pipe, or redirection: **listamsb** will not write
+ ATASCII to a terminal. **colorize-amsb** is not used, with this option.
+
+**-c**
+ Check only. No output on **stdout**. Diagnostics are still printed on stderr,
+ and the exit status is unchanged. It's an error to give an **output-file** with
+ this option.
+
+**-i**
+ Input uses Atari XL/XE International Character Set encoding, rather than
+ ATASCII graphics.
+
+**-u**
+ Use underlining for inverse video (see **a8cat**\(1) for more detail).
+
+**-t**
+ Text mode (see **a8cat**\(1) for more detail).
+
+**-m**
+ Magazine listing mode (see **a8cat**\(1) for more detail).
+
+**-s**
+ Strip bit 7 (inverse video bit; see **a8cat**\(1) for more detail).
+
+**-M**
+ Monochrome listing: disable color syntax highlighting, meaning **colorize-amsb**
+ is not used.
+
+**-r** *line-range*
+ Show only part of the listing. *line-range* can be a single line, or
+ a comma- or hyphen-separated pair of starting and ending line numbers (e.g. **100,200**, or
+ **1000-2000**).
+
+ If the start line number is omitted (e.g. **,100**), it will be treated as
+ **0** (meaning, list from the beginning of the program). If the ending line
+ number is omitted (e.g. **100,**), it means "list until the end of the program".
+ **-r,** or **-r-** is equivalent to not using the **-r** option at all.
+
+**-n**
+ No empty line. By default, **listamsb** prints an empty line at the
+ start of the output, to match AMSB's LIST command.
+
+Options for **-C** (crunch) Mode
+--------------------------------
+
+**-k**
+ Keep comment-only lines. Normally these are removed. If the program
+ gives UNDEF'D LINE ERROR, it means the target line was a comment-only
+ line that got removed. With **-k**, these lines will be kept, although
+ the actual comments won't (*10 REM HELLO* will become *10 REM*).
+
+Utility Options
+---------------
+
+**-v**
+ Verbose output, on **stderr**. May be given twice for extra verbosity,
+ which shows each line number, its offset, length, and end-of-line pointer.
+ Can be used with any of the mode options (**-C**, **-D**, **-L**, **-U**).
+
+**-h**\, **--help**
+ Print built-in help and exit.
+
+**--version**
+ Print version number and exit.
+
+DIAGNOSTICS
+===========
+
+All error and warning messages are written to the standard error output.
+
+Fatal errors
+------------
+
+These are errors in the program header at the start of the file. They
+generally mean the input isn't actually an tokenized Atari Microsoft
+BASIC file.
+
+- not an AMSB file: first byte not $00 or $01
+
+ Pretty self-explanatory: if the file doesn't begin with a *$00* or
+ *$01* byte, it's not a tokenized AMSB file.
+
+- not an AMSB file: too big (*N* bytes), won't fit in Atari memory
+
+ The file can't be a tokenized AMSB file because there was no way
+ for it to be created. It must be some other kind of file that begins
+ with a *$00* byte.
+
+- not an AMSB file: program size too small (*N*). Atari BASIC file?
+
+ The program header claims the file is 0, 1, 3, or 4 bytes long. This
+ is impossible, so this isn't an AMSB file. A lot of Atari BASIC
+ programs begin with three *$00* bytes, so that might be what this is.
+
+- program length is 2, no code in file (SAVE after NEW)
+
+ Probably, someone did a SAVE when there was no program in memory. It
+ could also mean this isn't an AMSB file at all.
+
+Warnings
+--------
+
+These are non-fatal: **listamsb** logs the warning to stderr, then
+continues processing.
+
+- unexpected EOF, file truncated?
+
+ A tokenized AMSB file always ends with three null bytes (*$00*\).
+ This file doesn't. Probably the rest of the file is missing.
+
+- line *L*: EOL address *A* too (low|high)
+
+ Each line begins with the address of the next line. If the address
+ is below *$0700*, it's below the minimum value of *MEMLO*, which
+ is impossible. If it's above *$bc1f*, it would be in the display
+ list, screen memory, or OS ROM (also impossible). File is
+ corrupt, or not an AMSB file.
+
+- line *L*: EOL address *A* <= previous *B*
+
+ Corrupt file, or not an AMSB file.
+
+- line *L* is suspiciously long
+
+ The line is >128 bytes long, but less than 256. AMSB can execute
+ lines of this length, but it's impossible to actually enter them
+ in the editor, because a logical line can't be longer than 3
+ screen lines. Possibly corrupted file.
+
+- line *L* is impossibly long
+
+ The line is >= 256 bytes long. AMSB will crash, if you try to
+ LOAD the file. Corrupted file.
+
+- line *L* EOL address doesn't match actual line length *N*
+
+ Corrupt file, or not an AMSB file.
+
+- line number out of order
+
+ Corrupt file, or not an AMSB file.
+
+- line number out range
+
+ The program contains a line number that's greater than *63999*. How
+ did that happen?
+
+- line *L* has character *C* outside of a string. maybe Atari BASIC?
+
+ This happens when ATASCII codes 0 to 31 (*$1f*\) appear in the program.
+ AMSB can create files like this, but at runtime, it's a syntax error.
+ More likely, it means this is an Atari BASIC file.
+
+- program size doesn't match size in header
+
+ Might mean this isn't an AMSB file. If you're sure it is, it might
+ be truncated, or part of the file might have been overwritten with
+ *$00* bytes. It could also mean the length in the header has somehow
+ gotten corrupted.
+
+- trailing garbage at end of file
+
+ Might mean this isn't an AMSB file. If you're sure it is, garbage
+ data has somehow gotten appended to the file, after the three *$00*
+ bytes that end the program. Maybe it was downloaded with a crappy
+ version of XMODEM that pads the last block. The good news is,
+ AMSB will just ignore the garbage when you LOAD the file, so it
+ won't hurt anything.
+
+- file has *N* unknown tokens
+
+ Either the file is corrupt, or this is a file from some *other* variant
+ of Microsoft BASIC (e.g. Commodore, AppleSoft, GW-BASIC, TRS-80). If
+ you see this warning, you'll also see *N* <unknown token *XX*>
+ messages in the actual listing.
+
+ENVIRONMENT
+===========
+
+**COLORIZE_AMSB**
+ Path to the **colorize-amsb** executable. Can be the absolute path
+ or just the executable (searched for in **PATH**). If not set,
+ defaults to *colorize-amsb*.
+
+
+LIMITATIONS
+===========
+
+**listamsb** may behave strangely when fed something other than a
+tokenized AMSB program, at least if the first byte in the file
+is **$00** or **$01**. Unfortunately, tokenized Atari BASIC (and
+variants like Turbo and BASIC XL) begin with **$00**. Usually
+you'll get this error::
+
+ not an AMSB file: program size too small (0). Atari BASIC file?
+
+\.\.\.but occasionally you may get a bunch of warnings and gibberish
+output instead.
+
+EXIT STATUS
+===========
+
+0 for success, 1 if there was an error reading the input (e.g. file
+not found), or 2 if the input file had errors or warnings (see
+**DIAGNOSTICS**).
+
+.. include:: manftr.rst
diff --git a/listbas.1 b/listbas.1
new file mode 100644
index 0000000..0278ed4
--- /dev/null
+++ b/listbas.1
@@ -0,0 +1,519 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "LISTBAS" 1 "2025-03-26" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+listbas \- List the source of a tokenized Atari 8-bit BASIC program
+.SH SYNOPSIS
+.sp
+listbas [\fB\-a\fP | \fB\-d\fP | \fB\-m\fP | \fB\-x\fP | \fB\-U\fP] [\fB\-B\fP] [\fB\-u\fP] [\fB\-i\fP] [\fB\-l\fP] [\fB\-n\fP | \fB\-C\fP] [\fB\-v\fP] [\fB\-c\fP \fIcolors\fP] [\fB\-r\fP \fIline\-range\fP] \fBinput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBlistbas\fP acts like the \fILIST\fP command in BASIC. It reads a
+tokenized (SAVEd) BASIC program and prints the code in human\-readable
+format.
+.sp
+By default, output is Unicode in UTF\-8 encoding, with ANSI/VT220
+escape sequences for inverse video and color syntax highlighting.
+.sp
+\fBlistbas\fP supports several BASIC dialects used on the Atari. By
+default, the BASIC dialect is autodetected by running \fBwhichbas\fP(1)
+as an external process. To override this, see the \fB\-b\fP option, below.
+.sp
+Note: OSS Integer BASIC is \fInot\fP to be confused with Apple II Integer BASIC!
+.SH OPTIONS
+.SS BASIC options
+.INDENT 0.0
+.TP
+.B \fB\-b\fP
+Set the BASIC dialect the program will be treated as. This disables
+autodetection. Supported dialects are:
+.INDENT 7.0
+.TP
+.B \fB\-ba\fP
+Atari BASIC.
+.TP
+.B \fB\-ba+\fP
+OSS BASIC/A+.
+.TP
+.B \fB\-bic\fP
+OSS Integer BASIC, cartridge version.
+.TP
+.B \fB\-bid\fP
+OSS Integer BASIC, disk version (uses different tokens from the cart).
+.TP
+.B \fB\-bt\fP
+Turbo BASIC XL.
+.TP
+.B \fB\-bxl\fP
+OSS BASIC XL.
+.TP
+.B \fB\-bxe\fP
+OSS BASIC XE.
+.UNINDENT
+.sp
+See \fBBASIC DIALECTS\fP below for details.
+.TP
+.B \fB\-r\fP \fIline\-range\fP
+Show only part of the listing. \fIline\-range\fP can be a single line, or
+a comma\-separated pair of starting and ending line numbers (e.g. \fB100,200\fP).
+If the start line number is omitted (e.g. \fB,100\fP), it will be treated as
+\fB0\fP (meaning, list from the beginning of the program). If the ending line
+number is omitted (e.g. \fB100,\fP), it means "list until the end of the program".
+\fB\-r,\fP is equivalent to not using the \fB\-r\fP option at all.
+.TP
+.B \fB\-i\fP
+Include the immediate mode command (line 32768) in the output. This option has no
+effect if the \fB\-r\fP option is used to stop listing before the end of the program.
+.TP
+.B \fB\-l\fP
+Do not print line numbers at the start of each line. \fBGOTO\fP, \fBGOSUB\fP,
+\fBTRAP\fP, and \fBTHEN\fP target line numbers are still printed.
+.TP
+.B \fB\-t\fP
+Do not indent, if the program is Turbo BASIC, BASIC/A+, BASIC XL, or BASIC XE.
+By default, indentation is enabled for everything but Atari BASIC.
+If you want to indent an Atari BASIC program, use \fB\-bt\fP or \fB\-bxe\fP\&.
+Integer BASIC indentation is not yet supported.
+.TP
+.B \fB\-k\fP
+Do not print keywords in mixed case (e.g. \fBPrint\fP, \fBGraphics\fP),
+for BASIC XL, BASIC XE, or Integer BASIC. Equivalent of \fBSET 5,0\fP\&.
+.UNINDENT
+.SS Output modes
+.sp
+The default output mode is Unicode/UTF\-8 representations of ATASCII
+characters.
+.INDENT 0.0
+.TP
+.B \fB\-U\fP
+Output Unicode/UTF\-8 representations of ATASCII characters. This is
+the default output mode; the \fB\-U\fP option is provided so you can
+override \fB\-a\fP, \fB\-d\fP, \fB\-m\fP, \fB\-x\fP in \fBLISTBAS_OPTS\fP (see
+\fBENVIRONMENT\fP, below).
+.TP
+.B \fB\-x\fP
+Output Unicode/UTF\-8 representations of the XL International Character
+Set, rather than ATASCII.
+.TP
+.B \fB\-a\fP
+Output raw ATASCII; no translation to the host character set. Must be
+used with redirection or a pipe; \fBlistbas\fP will not write ATASCII to the terminal.
+ATASCII output does not support color (because ATASCII doesn\(aqt).
+.TP
+.B \fB\-m\fP
+Output "magazine listing". See the \fB\-m\fP option for \fBa8cat\fP(1) for details.
+Color is supported in this mode. No Unicode/UTF\-8 characters are printed in
+this mode.
+.TP
+.B \fB\-d\fP
+Print dots rather than Unicode/UTF\-8 characters. Color and inverse
+video are still supported in this mode, but no Unicode/UTF8 characters
+are printed. Use this only if your terminal \fIreally\fP doesn\(aqt support
+Unicode (e.g. \fBrxvt\fP(1))... but even then, \fB\-m\fP is preferred,
+because you can\(aqt tell what the dots are supposed to represent.
+.UNINDENT
+.SS Other display options
+.INDENT 0.0
+.TP
+.B \fB\-C\fP
+Enable color syntax highlighting. This option is enabled by default;
+the \fB\-C\fP option is provided so you can override \fB\-n\fP in
+\fBLISTBAS_OPTS\fP (see \fBENVIRONMENT\fP, below).
+.TP
+.B \fB\-n\fP
+No color. Has no effect if \fB\-a\fP is in effect, since this
+mode doesn\(aqt support color anyway. Disabling color does not
+disable reverse video.
+.TP
+.B \fB\-B\fP
+Use bold for color output. This may make it easier to read on
+some terminals. Or, it may hurt your eyes...
+.TP
+.B \fB\-u\fP
+Use underlining for inverse video, rather than reverse video output.
+.TP
+.B \fB\-c\fP \fIcolors\fP
+Customize the color scheme. See \fBCOLORS\fP, below, for the format of the
+\fIcolors\fP argument. Once you\(aqve found a set of colors you like,
+you can place this option in the \fBLISTBAS_OPTS\fP environment variable
+to use your colors by default. See \fBENVIRONMENT\fP, below.
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH BASIC DIALECTS
+.sp
+Note that Turbo, BASIC XL, and BASIC XE are all proper supersets of
+Atari BASIC, so you can view an Atari BASIC program with any of
+\fB\-bt\fP, \fB\-bxl\fP, or \fB\-bxe\fP\&. Also, BASIC XE is a superset of BASIC XL
+(provided BASIC XL\(aqs disk\-based toolkit extended commands are not used),
+so you can usually use \fB\-bxe\fP on a BASIC XL program.
+.sp
+BASIC/A+ uses incompatible tokens, so its programs can\(aqt be viewed as
+any of the others. Trying to do this results in a very funny\-looking
+listing, with commands like \fBPOSITION\fP with no arguments (or with a
+string argument, or \fBPOSITION #6;"string"\fP; it so happens A+ uses the
+same token number for \fBPOSITION\fP that the other BASICs use for
+\fB?\fP). The same thing would happen if you booted BASIC/A+ on an Atari
+and tried to \fBLOAD\fP an Atari BASIC program. I can\(aqt help but think
+this is a major reason BASIC/A+ didn\(aqt sell that well (fortunately,
+OSS realized their mistake and fixed it in BASIC XL).
+.sp
+OSS Integer BASIC also uses incompatible tokens. However, it uses a
+different signature (first byte of file is \fB$77\fP), so it will be
+reliably autodetected. The disk and cartridge versions of Integer
+BASIC use different tokens; this is also autodetected pretty
+reliably. If the code doesn\(aqt make sense, try \fB\-bic\fP or \fB\-bid\fP
+to override the autodetection.
+.sp
+If you see lots of "bad token XX" messages, or if the code
+just doesn\(aqt make any sense, you\(aqre using the wrong BASIC
+option. \fBwhichbas\fP(1) can usually detect the BASIC a program was
+written in, but if the results are ambiguous, \fBlistbas\fP will assume
+Turbo BASIC XL. If this is wrong, use \fB\-bxl\fP or \fB\-bxe\fP to force
+the issue.
+.SH COLORS
+.sp
+Color output only works on terminal emulators (or real terminals)
+that support ANSI/VT220 style escape codes. This includes all modern
+terminal emulators, and most not\-so\-modern ones in the UNIX world. See
+\fBNOTES\fP for a list of tested terminal emulators.
+.sp
+You can customize the colors by using the \fB\-c\fP \fIcolors\fP option, either
+on the command line, or in the \fBLISTBAS_OPTS\fP environment variable.
+\fIcolors\fP is a string of exactly 8 characters, each of which must be the
+digits \fI0\fP through \fI7\fP to specify a color, or the letter \fIn\fP to specify
+no color.
+.sp
+The colors are the standard ANSI ones, plus \fIn\fP:
+.INDENT 0.0
+.TP
+.B \fI0\fP
+Black.
+.TP
+.B \fI1\fP
+Red.
+.TP
+.B \fI2\fP
+Green.
+.TP
+.B \fI3\fP
+Yellow (or brown/orange, on some terminals).
+.TP
+.B \fI4\fP
+Blue.
+.TP
+.B \fI5\fP
+Purple (aka violet).
+.TP
+.B \fI6\fP
+Cyan.
+.TP
+.B \fI7\fP
+White.
+.TP
+.B \fIn\fP
+No custom color. Output will be in the terminal\(aqs default foreground color.
+.UNINDENT
+.sp
+The order they\(aqre used in the \fIcolors\fP argument is:
+.INDENT 0.0
+.TP
+.B \fB1\fP
+BASIC keywords. Default: \fI3\fP (yellow).
+.TP
+.B \fB2\fP
+Operators, including quotes around strings and commas between \fBDATA\fP items. Default: \fI2\fP (green).
+.TP
+.B \fB3\fP
+Functions. Default: \fI5\fP (purple).
+.TP
+.B \fB4\fP
+Constants (numeric or string). Default: \fI1\fP (red).
+.TP
+.B \fB5\fP
+Line numbers (at the start of a line only; \fBGOTO\fP and \fBGOSUB\fP line numbers
+are constants). Default: \fI6\fP (cyan).
+.TP
+.B \fB6\fP
+\fBREM\fP text. Default: \fI4\fP (blue).
+.TP
+.B \fB7\fP
+\fBDATA\fP items (but not the commas between them). Default: \fI6\fP (cyan).
+.TP
+.B \fB8\fP
+Variable names. Default: \fIn\fP (uncolorized).
+.UNINDENT
+.sp
+So, the default color scheme is equivalent to:
+.INDENT 0.0
+.INDENT 3.5
+\fB\-c\fP \fI3251646n\fP
+.UNINDENT
+.UNINDENT
+.sp
+Black and white are not used by default because presumably, one or the
+other is the background color of the terminal.
+.SH NOTES
+.SS Indentation
+.sp
+The indentation isn\(aqt all that well\-tested yet, but so far it seems work
+correctly. The \fB\-t\fP option is the equivalent of \fB*L\-\fP for Turbo,
+or \fBSET 12,0\fP for BXL/BXE. The different BASICs have different
+indentation rules; try viewing the same Atari BASIC program with
+\fB\-bt\fP, \fB\-bxl\fP, and \fB\-bxe\fP to compare them.
+.sp
+\fBlistbas \-t\fP is also (as far as I know) the only way to \fBLIST\fP
+a BASIC/A+ program without indentation, since BASIC/A+ itself doesn\(aqt
+have a way to disable it.
+.sp
+Turbo BASIC, at least, will "max out" the indentation level at some
+point. Once there are 60 or so levels of indent, it stops adding
+more. \fBlistbas\fP doesn\(aqt emulate this behaviour (shouldn\(aqt be a
+problem, it\(aqs a pathological case).
+.sp
+BASIC XL actually does indentation within a line. If you write:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 IF A:IF B:IF C:REM
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...BXL lists it as:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 If A: If B: If C:Rem
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBlistbas\fP only indents at the start of a line, so this behaviour is
+not emulated.
+.sp
+One thing \fBlistbas\fP gets right: the \fBLIST\fP command in Turbo, A+,
+BXL, and BXE always starts out with 0 indent spaces, if you\(aqre only
+listing part of a program. BXE example:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 While 1
+20 If Peek(764)<>255
+30 ? "SOMEONE PRESSED A KEY":Poke 764,255
+40 Endif
+50 Endwhile
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\&...but if you give a \fBLIST 30\fP in BXE, you\(aqll get line 30 without any
+indentation. \fBlistbas\fP does this, too, if you use the \fB\-r\fP option.
+.SS Protected Programs
+.sp
+\fBlistbas\fP will refuse to operate on a LIST\-protected program with
+scrambled variable names. For code\-protected programs, it will stop at
+the line with the invalid offset. Use \fBunprotbas\fP(1) to remove the
+protection.
+.SS Comparison to chkbas
+.sp
+\fBlistbas\fP is similar to Jindroush\(aqs \fBchkbas\fP(1). The main differences are:
+.INDENT 0.0
+.IP \(bu 2
+\fBlistbas\fP prints ATASCII graphics as Unicode equivalents, so the listing
+looks very similar to how it would appear on the Atari.
+.IP \(bu 2
+\fBlistbas\fP does color syntax highlighting.
+.IP \(bu 2
+\fBlistbas\fP supports OSS BASIC/A+ and Integer BASIC in addition to Turbo and BXL/BXE.
+.IP \(bu 2
+\fBlistbas\fP indents BASIC/A+, Turbo, BXL, and BXE code, just like the
+actual BASICs do.
+.IP \(bu 2
+\fBlistbas\fP doesn\(aqt show information about the variables. Use \fBvxrefbas\fP(1)
+for that.
+.IP \(bu 2
+\fBlistbas\fP will not write ATASCII data to your terminal. By default, it
+converts ATASCII characters into Unicode/UTF\-8 characters
+that won\(aqt confuse the terminal. When outputting raw ATASCII (\fB\-a\fP option),
+it refuses to run if standard output is a terminal.
+.IP \(bu 2
+\fBlistbas\fP only lists line 32768 (the immediate mode command) if
+specifically asked to do so.
+.IP \(bu 2
+\fBlistbas\fP doesn\(aqt print a banner on startup.
+.IP \(bu 2
+\fBlistbas\fP tells you if the program is protected, and refuses to operate
+on variable\-protected programs. For code\-protected programs, it lists
+the program up to the "poisoned" line (normally the last line).
+.UNINDENT
+.SS Terminal Support
+.sp
+The color and inverse/bold/underline support assumes your terminal supports
+ANSI/VT220 escape codes... but it does \fInot\fP use \fBcurses\fP(3X) or
+\fBterminfo\fP(5), or even look at \fBTERM\fP in the environment. It just
+blindly emits the escape codes. Likewise, Unicode characters are printed
+in UTF\-8 encoding, without actually checking whether the terminal or the
+current locale supports UTF\-8.
+.sp
+\fBlistbas\fP has been tested and is known to work in at least these
+terminals:
+.INDENT 0.0
+.INDENT 3.5
+\fBrxvt\-unicode\fP, aka \fBurxvt\fP\&. This is the terminal the author uses.
+.sp
+\fBxterm\fP \- tested frequently. Requires the XTerm.locale resource
+to be set to \fBUTF\-8\fP (e.g. in \fB~/.Xdefaults\fP), or the \fB\-lc\fP
+and/or \fB\-en UTF\-8\fP command line options.
+.sp
+\fBLinux console\fP \- works fine, but good luck finding a font with
+all the Unicode graphics characters. Better use \fB\-m\fP\&.
+.sp
+\fBkitty\fP \- very fancy terminal emulator that supports both X11 and
+Wayland. \fBlistbas\fP was only tested on X11.
+.sp
+\fBxfce4\-terminal\fP \- version 0.8.10, with XFCE4 4.16.0.
+.sp
+\fBkonsole\fP \- the KDE terminal, from KDE 5.90.
+.sp
+\fBgnome\-terminal\fP \- version 3.43.90.
+.sp
+\fBst\fP \- minimal terminal from suckless.org, version 0.9.2.
+.sp
+\fBmlterm\fP \- version 3.9.3.
+.sp
+\fBkmscon\fP \- version 9.0.0. \fI\%https://github.com/Aetf/kmscon\fP
+.sp
+\fBfbterm\fP \- version 1.8. \fI\%https://github.com/sfzhi/fbterm\fP
+.UNINDENT
+.UNINDENT
+.sp
+Also, \fBrxvt\fP and \fBaterm\fP don\(aqt support Unicode, but they will
+otherwise work (display color and inverse) with the \fB\-m\fP or \fB\-d\fP
+options to \fBlistbas\fP\&.
+.SS HTML Output
+.sp
+See \fBabas2html\fP(1).
+.SH ENVIRONMENT
+.INDENT 0.0
+.TP
+.B \fBLISTBAS_OPTS\fP
+If this environment variable is set, \fBlistbas\fP parses its value as though
+the contents were placed on the command line as options, preceding any actual
+option. Example:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+export LISTBAS_OPTS="\-c123456 \-d"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+If you place the above line in your shell\(aqs startup script, \fBlistbas\fP will
+use your custom color scheme, and will default to the "dots" output mode. If
+you then run \fBlistbas\fP the \fB\-c\fP and/or \fB\-x\fP, \fB\-m\fP options, the options
+on the command line will override the environment.
+.UNINDENT
+.SH EXIT STATUS
+.sp
+0 for success, 1 if there was an error reading the input (e.g. file
+not found), or 2 if the input file has invalid tokens (if this
+happens, you will also see a warning about it on stderr).
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/listbas.c b/listbas.c
new file mode 100644
index 0000000..7e4b2e7
--- /dev/null
+++ b/listbas.c
@@ -0,0 +1,1234 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include <math.h>
+#include <errno.h>
+
+#include <sys/wait.h>
+
+#include "bas.h"
+#include "bcdfp.h"
+#include "tokens.h"
+#include "turbo_tokens.h"
+#include "aplus_tokens.h"
+#include "bxl_tokens.h"
+#include "bxe_tokens.h"
+#include "int_tokens.h"
+#include "int_disk_tokens.h"
+#include "atables.h"
+#include "whichbas.h"
+
+#define B_ATARI SRET_ATARI
+#define B_TURBO SRET_TURBO
+#define B_APLUS SRET_APLUS
+#define B_BXL SRET_BXL
+#define B_BXE SRET_BXE
+#define B_INT_C SRET_OSSINT_CART
+#define B_INT_D SRET_OSSINT_DISK
+
+#define COLOR_FMT "\x1b[%d;3%dm" /* 1st %d is 1 for bold, 2nd is color */
+
+#define COLOR_OFF "\x1b[0m" /* clears inverse, too! */
+#define INV_OFF "\x1b[0m" /* clears color, too! */
+
+/* These would be better to use, allow turning off color and inverse
+ independently, but are not as widely supported by various terminals. */
+/* #define COLOR_OFF "\x1b[39;49m" */
+/* #define INV_OFF "\x1b[27m"" */
+
+#define INV_ON "\x1b[7m" /* goes all the way back to the original VT100 */
+#define ULINE_ON "\x1b[4m"
+
+#define MAG_INV "{inv}"
+#define MAG_NORM "{norm}"
+
+/* colors. */
+#define NO_COLOR -1
+#define C_RED 1
+#define C_GREEN 2
+#define C_YELLOW 3
+#define C_BLUE 4
+#define C_PURPLE 5
+#define C_CYAN 6
+#define C_WHITE 7
+
+#define ENV_OPTS "LISTBAS_OPTS"
+#define ENV_MAX_ARGS 64
+/* #define DEBUG_ENV */
+
+/* output modes */
+#define M_UTF8 0 /* default */
+#define M_UTF8_I 1 /* -x */
+#define M_ATASCII 2 /* -a */
+#define M_MAG 3 /* -m */
+#define M_DOTS 4 /* -d */
+
+const char *cmd_tokens[256];
+const char *op_tokens[256];
+
+int bas_type = B_ATARI; /* -b */
+
+int output_mode = M_UTF8;
+
+int bold = 0; /* 1 with -B */
+int color = 1; /* 0 with -n */
+int immediate = 0; /* 1 with -i */
+int underline = 0; /* 1 with -u */
+int skip_lineno = 0; /* 1 with -l */
+int dump_tables = 0; /* 1 with -D */
+int autodetect = 1; /* 0 with -b */
+int mixed_case = 1; /* 0 with -k, or if input is B_ATARI or B_APLUS */
+int indent = 1; /* 0 with -t, or if input is B_ATARI */
+int startline = 0; /* -r */
+int endline = 32767; /* -r */
+
+/* change these with -c */
+int color_cmd = C_YELLOW;
+int color_op = C_GREEN;
+int color_func = C_PURPLE;
+int color_const = C_RED;
+int color_lineno = C_CYAN;
+int color_rem = C_BLUE;
+int color_data = C_CYAN;
+int color_varnames = NO_COLOR;
+
+const char *input_filename;
+
+int indent_level = 0;
+int if_without_then = 0;
+int badtok = 0; /* set to 1 if we find a bad token */
+int inv = 0; /* set to 1 when we're printing inverse */
+int cur_color = -1; /* -1 = no color */
+
+int first_stmt = 1; /* true if cmd token comes right after lineno */
+
+FILE *outfh;
+
+int parse_color(char c) {
+ if(c == 'n')
+ return NO_COLOR;
+
+ if(c >= '0' && c <= '7')
+ return c - '0';
+
+ fprintf(stderr, "%s: Invalid color '%c'.\n", self, c);
+ exit(1);
+}
+
+void parse_color_scheme(const char *arg) {
+ if(!arg) return;
+
+ if(strlen(arg) != 8)
+ die("Color scheme must be 8 characters.");
+
+ color_cmd = parse_color(arg[0]);
+ color_op = parse_color(arg[1]);
+ color_func = parse_color(arg[2]);
+ color_const = parse_color(arg[3]);
+ color_lineno = parse_color(arg[4]);
+ color_rem = parse_color(arg[5]);
+ color_data = parse_color(arg[6]);
+ color_varnames = parse_color(arg[7]);
+}
+
+int get_bas_type(char *arg) {
+ if(arg[0] == 't')
+ return B_TURBO;
+
+ if(arg[0] == 'i') {
+ if(arg[1] == 'd')
+ return B_INT_D;
+ else if(arg[1] == 'c')
+ return B_INT_C;
+ }
+
+ if(arg[0] == 'a') {
+ if(arg[1] == '+')
+ return B_APLUS;
+ else
+ return B_ATARI;
+ }
+
+ if(arg[0] == 'x') {
+ if(arg[1] == 'l')
+ return B_BXL;
+ else if(arg[1] == 'e')
+ return B_BXE;
+ }
+
+ fprintf(stderr, "%s: Invalid BASIC type for -b option: %s\n", self, arg);
+ exit(1);
+}
+
+void get_line_range(const char *arg) {
+ int val = 0, comma = 0;
+ const char *p = arg;
+
+ while(*p) {
+ if(*p >= '0' && *p <= '9') {
+ val *= 10;
+ val += *p - '0';
+ if(val > 32768) die("Invalid line number for -r (range is 0-32768).");
+ } else if(*p == ',' || *p == '-') {
+ if(comma) die("Invalid argument for -r (too many commas).");
+ comma++;
+ startline = val;
+ val = 0;
+ } else {
+ if(comma) die("Invalid argument for -r (only digits and comma allowed).");
+ }
+ p++;
+ }
+
+ if(comma)
+ endline = val ? val : 32767;
+ else
+ startline = endline = val;
+
+ if(endline < startline)
+ die("Invalid argument for -r (start > end).");
+}
+
+void print_help(void) {
+ printf("Usage: %s [-a|-d|-m|-x|-U] [-B] [-i] [-l] [-u] [-n|-C] [-v] [-c *colors*] [-r *start,end* ] [-k] [-t] <inputfile>\n", self);
+ printf(" -b <XX>: set BASIC type. XX is:\n");
+ printf(" a = Atari 8K t = Turbo xl = Basic XL xe = Basic XE\n");
+ printf(" a+ = OSS A+ ic = OSS Integer (cart) id = OSS Int (disk)\n");
+ printf(" -U: output ATASCII as Unicode/UTF-8 (this is the default).\n");
+ printf(" -a: output raw ATASCII.\n");
+ printf(" -d: use dots instead of Unicode/UTF-8.\n");
+ printf(" -m: magazine style listing (see a8cat(1)).\n");
+ printf(" -x: XL international character set (UTF-8).\n");
+ printf(" -B: use bold for color output.\n");
+ printf(" -i: show immediate mode command (line 32768).\n");
+ printf(" -l: don't print line numbers.\n");
+ printf(" -C: enable color syntax highlighting (this is the default).\n");
+ printf(" -n: disable color syntax highlighting.\n");
+ printf(" -u: use underline for inverse video.\n");
+ printf(" -c: use custom colors (see man page).\n");
+ printf(" -k: disable mixed case keywords for BXL/BXE (e.g. Print).\n");
+ printf(" -t: disable Turbo/BXL/BXE indentation.\n");
+ printf(" -r: only list lines numbered from *start* to *end*.\n");
+ printf(" -v: verbose.\n");
+}
+
+void parse_args(int argc, char **argv, int from_env) {
+ int opt;
+
+ optind = 1;
+
+ while( (opt = getopt(argc, argv, "r:Db:UCviamnBdhxulc:kt")) != -1) {
+ switch(opt) {
+ case 'U': output_mode = M_UTF8; break;
+ case 'a': output_mode = M_ATASCII; break;
+ case 'm': output_mode = M_MAG; break;
+ case 'd': output_mode = M_DOTS; break;
+ case 'x': output_mode = M_UTF8_I; break;
+ case 'D': dump_tables = 1; break;
+ case 'v': verbose = 1; break;
+ case 'i': immediate = 1; break;
+ case 'B': bold = 1; break;
+ case 'u': underline = 1; break;
+ case 'C': color = 1; break;
+ case 'n': color = 0; break;
+ case 'l': skip_lineno = 1; break;
+ case 'k': mixed_case = 0; break;
+ case 't': indent = 0; break;
+ case 'b': autodetect = 0; bas_type = get_bas_type(optarg); break;
+ case 'r': get_line_range(optarg); break;
+ case 'c': parse_color_scheme(optarg); break;
+ case 'h': print_help(); exit(0);
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(output_mode == M_ATASCII) color = 0;
+
+ if(!from_env) {
+ if(optind >= argc) {
+ die("No input file given (use - for stdin).");
+ } else {
+ input_filename = argv[optind];
+ open_input(input_filename);
+ }
+ }
+}
+
+/* make a fake argv and argc */
+void parse_env_args(void) {
+ int fargc;
+ char *fargv[ENV_MAX_ARGS + 1];
+ char *env, *p;
+
+ env = getenv(ENV_OPTS);
+ if(!env) return;
+
+#ifdef DEBUG_ENV
+ fprintf(stderr, "%s: " ENV_OPTS " is set in the env, using it.\n", self);
+#endif
+
+ fargv[0] = (char *)self;
+ fargv[1] = env;
+ fargc = 2;
+
+ for(p = env; *p; p++) {
+ if(*p == ' ' || *p == '\t') {
+ *p = '\0';
+ if(fargc == ENV_MAX_ARGS) {
+ /* not gonna bother with the man page for this, it's
+ long enough already. it's a pathological case. */
+ fprintf(stderr, "%s: Too many spaces in " ENV_OPTS " (max %d)\n", self, ENV_MAX_ARGS - 1);
+ break;
+ }
+ fargv[fargc++] = p + 1;
+ }
+ }
+
+ fargv[fargc] = NULL;
+
+#ifdef DEBUG_ENV
+ {
+ char **p;
+ fprintf(stderr, "%s: Read options from environment:\n", self);
+ for(p = fargv + 1; *p; p++) {
+ fprintf(stderr, "\t%s\n", *p);
+ }
+ }
+#endif
+
+ parse_args(fargc, fargv, 1);
+}
+
+void setup_outfh(void) {
+ if(output_mode == M_ATASCII) {
+ if(isatty(fileno(stdout))) {
+ die("Refusing to write ATASCII data to the terminal.");
+ }
+ }
+ outfh = freopen(NULL, "wb", stdout);
+ if(!outfh) {
+ perror("freopen()");
+ die("Can't reopen standard output in binary mode.");
+ }
+ return;
+}
+
+void outchr(char c) {
+ putc(c, outfh);
+}
+
+/* this should probably be moved to bcdfp.c */
+double bcd2double(const unsigned char *num) {
+ double result = 0, sign;
+ int exp, i;
+
+ exp = *num;
+ if(!exp) {
+ return 0.0;
+ }
+
+ sign = (exp & 0x80 ? -1.0 : 1.0);
+ exp &= 0x7f;
+ exp -= 0x40;
+
+ for(i = 1; i < 6; i++) {
+ result *= 100.0;
+ result += bcd2int(num[i]);
+ }
+
+ result *= pow(100, exp - 4);
+ result *= sign;
+
+ return result;
+}
+
+void color_on(int c) {
+ cur_color = c;
+ if(c != NO_COLOR)
+ printf(COLOR_FMT, bold, c);
+}
+
+void color_off(void) {
+ cur_color = -1;
+ fputs(COLOR_OFF, outfh);
+}
+
+void print_int_number(unsigned int pos, int hex) {
+ unsigned int num = program[pos] | (program[pos + 1] << 8);
+ if(color) color_on(color_const);
+ if(hex) {
+ fprintf(outfh, (num > 0xff ? "%04x" : "%02x"), num);
+ } else {
+ fprintf(outfh, "%d", num);
+ }
+ if(color) color_off();
+}
+
+void print_bcd_number(unsigned int pos, int hex) {
+ double num = bcd2double(program + pos);
+ if(color) color_on(color_const);
+ if(hex) {
+ if(num < 0 || num > 0xffff) {
+ fprintf(stderr, "%s: invalid Turbo/BXL/BXE hex const %lf at pos $%04x\n", self, num, pos);
+ }
+ fprintf(outfh, (num > 0xff ? "%04x" : "%02x"), (unsigned int)num);
+ } else {
+ fprintf(outfh, "%G", num);
+ }
+ if(color) color_off();
+}
+
+void print_number(unsigned int pos, int hex) {
+ if(bas_type == B_INT_C || bas_type == B_INT_D)
+ print_int_number(pos, hex);
+ else
+ print_bcd_number(pos, hex);
+}
+
+/* only called in magazine mode. cursor control characters
+ like a bell in the middle of a non-inverse string
+ should not cause it to print {inv}{bell}{norm}. The {bell}
+ is "inherently" inverse (since its high bit is set) but doesn't
+ need to be printed that way. */
+int affects_inv(unsigned char c) {
+ switch(c) {
+ case 0x1b: /* esc */
+ case 0x1c: /* up */
+ case 0x1d: /* down */
+ case 0x1e: /* left */
+ case 0x1f: /* right */
+ case 0x9b: /* EOL */
+ case 0x9c: /* del line */
+ case 0x9d: /* ins line */
+ case 0x9e: /* clear tab */
+ case 0x9f: /* set tab */
+ case 0x7d: /* cls */
+ case 0x7e: /* BS */
+ case 0x7f: /* tab */
+ case 0xfd: /* bell */
+ case 0xfe: /* del chr */
+ case 0xff: /* ins chr */
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+void start_inv(unsigned char c) {
+ switch(output_mode) {
+ case M_DOTS:
+ case M_UTF8:
+ case M_UTF8_I:
+ if(underline)
+ fputs(ULINE_ON, outfh);
+ else
+ fputs(INV_ON, outfh);
+ inv = 1;
+ break;
+ case M_MAG:
+ if(affects_inv(c)) {
+ fputs(MAG_INV, outfh);
+ inv = 1;
+ }
+ break;
+ case M_ATASCII:
+ default:
+ break;
+ }
+}
+
+void end_inv(unsigned char c) {
+ switch(output_mode) {
+ case M_DOTS:
+ case M_UTF8:
+ case M_UTF8_I:
+ fputs(INV_OFF, outfh);
+ inv = 0;
+ /* work around INV_OFF also turning off color. */
+ if(cur_color > -1)
+ color_on(cur_color);
+ break;
+ case M_MAG:
+ if(affects_inv(c)) {
+ fputs(MAG_NORM, outfh);
+ inv = 0;
+ }
+ break;
+ case M_ATASCII:
+ default:
+ break;
+ }
+}
+
+void print_ata_chr(unsigned char c) {
+ if(c & 0x80) {
+ if(!inv) {
+ start_inv(c);
+ }
+ } else {
+ if(inv) {
+ end_inv(c);
+ }
+ }
+
+ switch(output_mode) {
+ case M_DOTS:
+ fputc(isprint(c & 0x7f) ? c & 0x7f : '.', outfh);
+ break;
+ case M_UTF8:
+ fputs(ata2utf[c & 0x7f], outfh);
+ break;
+ case M_UTF8_I:
+ fputs(ics2utf[c & 0x7f], outfh);
+ break;
+ case M_MAG:
+ fputs(ata2mag[c & 0x7f], outfh);
+ break;
+ case M_ATASCII:
+ default:
+ outchr(c);
+ break;
+ }
+}
+
+void print_mixed_case(const char *name) {
+ char c;
+
+ if(!*name) return;
+ if(*name == ' ')
+ outchr(*name++);
+ outchr(*name++);
+ while(( c = *name++)) {
+ if(c >= 'A' && c <= 'Z')
+ c |= 0x20;
+ if(color && c == '(' && cur_color != color_op) color_on(color_op);
+ outchr(c);
+ }
+}
+
+void print_string(unsigned int pos, unsigned int len) {
+ inv = 0;
+ if(color) color_on(color_op);
+ outchr('"');
+ if(color) color_on(color_const);
+ while(len--) print_ata_chr(program[pos++]);
+ if(inv) {
+ end_inv(0);
+ }
+ if(color) color_on(color_op);
+ outchr('"');
+ if(color) color_off();
+}
+
+const char *get_bxl_ext_name(unsigned char tok) {
+ switch(tok) {
+ case 0x10:
+ return "Local";
+ case 0x11:
+ return "Exit";
+ case 0x12:
+ return "Procedure";
+ case 0x13:
+ return "Call";
+ case 0x14:
+ return "Sortup";
+ case 0x15:
+ return "Sortdown";
+ default:
+ return "(bad BXL ext token)";
+ }
+}
+
+void clear_callbacks(void);
+void init_callbacks(void);
+
+int cmd_is_if;
+
+CALLBACK(find_cmd_if) {
+ cmd_is_if = 0;
+ if((bas_type == B_APLUS && tok == 0x06) || (bas_type != B_APLUS && tok == CMD_IF)) {
+ cmd_is_if = 1;
+ if_without_then++; /* find_then() decrements it, if there's a THEN */
+ }
+}
+
+CALLBACK(find_op_then) {
+ if(verbose)
+ fprintf(stderr, "find_op_then lineno %d, pos %04x, tok %02x\n", lineno, pos, tok);
+
+ if(cmd_is_if && tok == OP_THEN)
+ if_without_then--;
+}
+
+/* walk_code()'s API isn't really set up to be reentrant, but we
+ can do one level of sub-walk. */
+void find_then(int lineno, unsigned short pos) {
+ clear_callbacks();
+ on_exp_token = find_op_then;
+ on_cmd_token = find_cmd_if;
+ walk_code(lineno, lineno);
+ init_callbacks();
+}
+
+CALLBACK(print_lineno) {
+ unsigned char cmd_tok;
+
+ first_stmt = 1;
+
+ if(indent) {
+ cmd_tok = program[pos + 4];
+ if_without_then = 0;
+ if((bas_type == B_APLUS && cmd_tok == 0x06) || (bas_type != B_APLUS && cmd_tok == CMD_IF)) {
+ find_then(lineno, pos);
+ }
+ }
+
+ if(skip_lineno) return;
+ if(color) color_on(color_lineno);
+ fprintf(outfh, "%d ", lineno);
+ if(color) color_off();
+}
+
+/* indentation is totally different between A+, BXL, and BXE.
+ Turbo and BXE use the same indent style, but Turbo has more
+ keywords that indent (e.g. REPEAT, DO).
+
+ A+ always indents on the lines after a WHILE or a FOR, unless there's
+ a matching ENDWHILE or NEXT on the same line. It indents the lines
+ after IF only if there's no THEN and no matching ENDIF on the
+ same line. ENDWHILE, NEXT, ENDIF all un-undent one level. The style
+ is that the the ending keyword (or ELSE) does NOT get unindented,
+ itself:
+
+ WHILE 1
+ PRINT "OK"
+ ENDWHILE
+ PRINT "HEY"
+
+ That looks *wrong* to me (the ENDWHILE should line up with the WHILE), but
+ that's how A+ works.
+
+ BXL's style is to indent the entire block to the same level:
+
+ While 1
+ Print "OK"
+ Endwhile
+ Print "HEY"
+
+ This applies even if the whole block's on one line:
+
+ ? "OK"
+ For I=1 To 10:Next I
+ ? "OK"
+
+BXE and Turbo work like modern style: the keywords that start and end the
+block are not indented, only the lines between them.
+
+ While 1
+ Print "OK"
+ Endwhile
+ Print "HEY"
+
+ */
+
+void print_indent(void) {
+ int i;
+ if(indent_level < 0) indent_level = 0;
+ for(i = 0; i < indent_level; i++) {
+ outchr(' ');
+ outchr(' ');
+ }
+}
+
+void aplus_indent_line(const unsigned char tok) {
+ if(first_stmt) print_indent();
+
+ switch(tok) {
+ case 0x07: /* FOR */
+ case 0x13: /* WHILE */
+ indent_level++;
+ return;
+ case 0x08: /* NEXT */
+ case 0x14: /* ENDWHILE */
+ case 0x18: /* ENDIF */
+ indent_level--;
+ return;
+ default: break;
+ }
+ if(if_without_then) {
+ indent_level++;
+ if_without_then = 0;
+ }
+}
+
+void turbo_indent_line(const unsigned char tok) {
+ switch(tok) {
+ case 0x40: /* ELSE */
+ if(first_stmt) {
+ /* gets "outdented" */
+ indent_level--;
+ print_indent();
+ indent_level++;
+ }
+ return;
+ case CMD_FOR: /* FOR */
+ case 0x3c: /* REPEAT */
+ case 0x3e: /* WHILE */
+ case 0x45: /* DO */
+ case 0x4f: /* PROC */
+ if(first_stmt) print_indent();
+ indent_level++;
+ return;
+ case CMD_NEXT: /* NEXT */
+ case 0x3d: /* UNTIL */
+ case 0x3f: /* WEND */
+ case 0x41: /* ENDIF */
+ case 0x46: /* LOOP */
+ case 0x51: /* ENDPROC */
+ indent_level--;
+ break;
+ default: break;
+ }
+ if(first_stmt) print_indent();
+ if(if_without_then) {
+ indent_level++;
+ if_without_then = 0;
+ }
+}
+
+/* Note: BXL's PROCEDURE/EXIT (from toolkit extensions) does
+ *not* get indented. */
+void bxl_indent_line(unsigned char tok) {
+ if(if_without_then) {
+ indent_level++;
+ if_without_then = 0;
+ }
+ switch(tok) {
+ case CMD_FOR: /* FOR */
+ case 0x38: /* WHILE */
+ indent_level++;
+ break;
+ case CMD_NEXT: /* NEXT */
+ case 0x39: /* ENDWHILE */
+ case 0x3d: /* ENDIF */
+ if(first_stmt) print_indent();
+ indent_level--;
+ return;
+ default: break;
+ }
+ if(first_stmt) print_indent();
+}
+
+void bxe_indent_line(const unsigned char tok) {
+ switch(tok) {
+ case 0x3c: /* ELSE */
+ if(first_stmt) {
+ /* gets "outdented" */
+ indent_level--;
+ print_indent();
+ indent_level++;
+ }
+ return;
+ case CMD_FOR: /* FOR */
+ case 0x38: /* WHILE */
+ case 0x59: /* PROCEDURE */
+ if(first_stmt) print_indent();
+ indent_level++;
+ return;
+ case CMD_NEXT: /* NEXT */
+ case 0x39: /* ENDWHILE */
+ case 0x5e: /* EXIT */
+ case 0x3d: /* ENDIF */
+ indent_level--;
+ break;
+ default: break;
+ }
+ if(first_stmt) print_indent();
+ if(if_without_then) {
+ if_without_then = 0;
+ indent_level++;
+ }
+}
+
+void indent_line(const unsigned char tok) {
+ if(!indent) return;
+
+ switch(bas_type) {
+ case B_APLUS: aplus_indent_line(tok); return;
+ case B_TURBO: turbo_indent_line(tok); return;
+ case B_BXL: bxl_indent_line(tok); return;
+ case B_BXE: bxe_indent_line(tok); return;
+ /* TODO: case B_INT_C: int_indent_line(tok); return; */
+ case B_ATARI:
+ default:
+ return;
+ }
+}
+
+CALLBACK(print_cmd) {
+ const char *name;
+
+ indent_line(tok);
+ if(first_stmt)
+ first_stmt = 0;
+
+ if(bas_type == B_APLUS) {
+ if(tok == 0x52) return;
+ } else if(bas_type == B_INT_C) {
+ if(tok == 0x37) return;
+ } else if(bas_type == B_INT_D) {
+ if(tok == 0x35) return;
+ } else {
+ if(tok == CMD_ILET) return;
+ }
+
+ if(color) color_on(color_cmd);
+
+ if((!(name = cmd_tokens[tok]))) {
+ fprintf(outfh, "(bad cmd token $%02x) ", tok);
+ badtok = 1;
+ } else {
+ if(bas_type == B_BXL && tok == 0x5a)
+ name = get_bxl_ext_name(program[pos + 1]);
+
+ if(mixed_case /* && (bas_type == B_BXL || bas_type == B_BXE) */) {
+ print_mixed_case(name);
+ outchr(' ');
+ } else {
+ fprintf(outfh, "%s ", name);
+ }
+ }
+
+ if(color) color_off();
+}
+
+void aplus_op_color_on(unsigned char tok) {
+ int c = color_op;
+
+ if((tok >= 0x17 && tok <= 0x1c) || (tok >= 0x29 && tok <= 0x2b)) {
+ /* keywords */
+ c = color_cmd;
+ } else if(tok >= 0x40) {
+ /* functions */
+ c = color_func;
+ } else if(tok == 0x38 || tok == 0x39) {
+ /* unary +/- */
+ c = color_const;
+ }
+
+ color_on(c);
+}
+
+/* pseudo-funcs listed here are ones that don't take (), e.g.
+ X=RND or A$=INKEY$. right now they're colored the same as regular
+ functions, but it might make sense to color them as variables?
+ also, %0 %1 %2 %3 (tokens 0x66 to 0x69) are currently op-colored,
+ perhaps they should be constant-colored? */
+void turbo_op_color_on(unsigned char tok) {
+ switch(tok) {
+ case 0x55:
+ case 0x58:
+ case 0x59: /* pseudo-func */
+ case 0x5b:
+ case 0x5c:
+ case 0x5e:
+ case 0x5f: /* pseudo-func */
+ case 0x60: /* pseudo-func */
+ case 0x63: /* pseudo-func */
+ case 0x64:
+ case 0x65:
+ case 0x6b:
+ case 0x6c: /* pseudo-func */
+ case 0x6d: /* pseudo-func */
+ color_on(color_func);
+ break;
+ case 0x5a:
+ case 0x5d:
+ case 0x61:
+ case 0x62:
+ case 0x6a:
+ color_on(color_cmd);
+ break;
+ default:
+ color_on(color_op);
+ break;
+ }
+}
+
+/* BXL and BXE use the same operator tokens */
+void bxlxe_op_color_on(unsigned char tok) {
+ int c = color_op;
+
+ if(tok == 0x55) {
+ c = color_cmd;
+ } else if(tok >= 0x5a) {
+ c = color_func;
+ }
+
+ color_on(c);
+}
+
+void op_color_on(unsigned char tok) {
+ if(!color) return;
+
+ if(bas_type == B_APLUS) {
+ aplus_op_color_on(tok);
+ return;
+ }
+
+ /* common ops for Atari, Turbo, BXL, BXE */
+ if(tok <= last_operator) {
+ if(tok > 0x3c)
+ color_on(color_func);
+ else if(tok == OP_UMINUS || tok == OP_UPLUS)
+ color_on(color_const); /* show leading sign in same color as the number */
+ else if((tok >= 0x17 && tok <= 0x1b) || (tok >= 0x28 && tok <= 0x2a))
+ color_on(color_cmd);
+ else
+ color_on(color_op);
+ return;
+ }
+
+ if(bas_type == B_TURBO)
+ turbo_op_color_on(tok);
+ else if(bas_type == B_BXL || bas_type == B_BXE)
+ bxlxe_op_color_on(tok);
+ else
+ color_on(color_op); /* in case of bad token when bas_type == B_BASIC */
+}
+
+void print_varname(unsigned char varnum) {
+ int i, count;
+ unsigned char c;
+
+ if(color) color_on(color_varnames);
+
+ for(i = vnstart, count = 0; count < varnum; i++) {
+ if(program[i] & 0x80) count++;
+ if(i == codestart) {
+ fprintf(outfh, "(bad var tok $%02x)", varnum | 0x80);
+ return;
+ }
+ }
+
+ do {
+ c = program[i++];
+ if(color && c == ('(' | 0x80)) {
+ if(color) color_on(color_op);
+ }
+ outchr(c & 0x7f);
+ } while (c < 0x80);
+ if(color) color_off();
+}
+
+CALLBACK(print_op) {
+ const char *name;
+
+ switch(tok) {
+ case 0: /* Turbo variables numbered >= $80 */
+ if(bas_type == B_TURBO) {
+ print_varname(program[pos + 1] | 0x80);
+ return;
+ } else {
+ fprintf(stderr, "%s: got Turbo ext var tok at line %d, in non-Turbo program!\n", self, lineno);
+ }
+ break;
+ case OP_HEXCONST:
+ if(color) color_on(color_op);
+ outchr('$');
+ print_number(pos + 1, 1);
+ return;
+ case OP_NUMCONST:
+ print_number(pos + 1, 0);
+ return;
+ case OP_STRCONST:
+ print_string(pos + 2, program[pos + 1]);
+ return;
+ case OP_EOL:
+ /* in Integer BASIC, this token is TO */
+ if((bas_type != B_INT_C) && (bas_type != B_INT_D)) return;
+ break;
+ case 0x13:
+ /* in Integer BASIC, this is the real end-of-line token */
+ if(bas_type == B_INT_D || bas_type == B_INT_C) return;
+ default: break;
+ }
+
+ if(color) op_color_on(tok);
+
+ if((!(name = op_tokens[tok]))) {
+ fprintf(outfh, "(bad op token $%02x)", tok);
+ badtok = 1;
+ } else {
+ if(bas_type == B_BXL || bas_type == B_BXE || bas_type == B_INT_C || bas_type == B_INT_D)
+ print_mixed_case(name);
+ else
+ fprintf(outfh, "%s", name);
+ }
+ if(color) color_off();
+}
+
+/* for normal BASIC/A+/XL/XE variable tokens, $80-$FF. Turbo uses
+ these, too, but it supports 256 variables, so it only uses $80-$FF
+ for the first 128 vars. */
+CALLBACK(print_std_varname) {
+ print_varname(tok & 0x7f);
+}
+
+CALLBACK(print_text) {
+ unsigned char c, is_data = program[pos - 1] == CMD_DATA, comma = 0;
+
+ inv = 0;
+ if(color) color_on(is_data ? color_data : color_rem);
+ while(program[pos] != 0x9b) {
+ c = program[pos++];
+ if(color && is_data && c == ',') {
+ color_on(color_op);
+ comma = 1;
+ } else {
+ comma = 0;
+ }
+ print_ata_chr(c);
+ if(comma)
+ color_on(is_data ? color_data : color_rem);
+ }
+ if(inv) end_inv(0);
+ if(color) color_off();
+}
+
+CALLBACK(print_newline) {
+ if(output_mode == M_ATASCII)
+ outchr(0x9b);
+ else
+ outchr('\n');
+}
+
+CALLBACK(code_prot) {
+ fprintf(stderr, "%s: Program is code-protected, stopping at line %d.\n", self, lineno);
+ exit(0);
+}
+
+void clear_callbacks(void) {
+ on_start_line = 0;
+ on_cmd_token = 0;
+ on_exp_token = 0;
+ on_var_token = 0;
+ on_end_line = 0;
+ on_text = 0;
+ on_bad_line_length = 0;
+}
+
+void init_callbacks(void) {
+ on_start_line = print_lineno;
+ on_cmd_token = print_cmd;
+ on_exp_token = print_op;
+ on_var_token = print_std_varname; /* see also: print_turbo_varname() */
+ on_end_line = print_newline;
+ on_text = print_text;
+ on_bad_line_length = code_prot;
+}
+
+void list(void) {
+ init_callbacks();
+ if(endline == 32767 && immediate) endline++;
+ walk_code(startline, endline);
+}
+
+void init_bas_tables() {
+ memmove(cmd_tokens, commands, (last_command + 1) * sizeof(char *));
+ memmove(op_tokens, operators, (last_operator + 1) * sizeof(char *));
+}
+
+void init_aplus_tables() {
+ memmove(cmd_tokens, aplus_cmds, aplus_cmd_size);
+ memmove(op_tokens, aplus_ops, aplus_ops_size);
+}
+
+/* cartridge version */
+void init_int_tables() {
+ memmove(cmd_tokens, int_cmds, int_cmd_size);
+ memmove(op_tokens, int_ops, int_ops_size);
+}
+
+void init_int_disk_tables() {
+ memmove(cmd_tokens, int_disk_cmds, int_disk_cmd_size);
+ memmove(op_tokens, int_disk_ops, int_disk_ops_size);
+}
+
+void init_turbo_tables() {
+ memmove(cmd_tokens + last_command + 1, turbo_cmds, turbo_cmd_size);
+ memmove(op_tokens + last_operator + 1, turbo_ops, turbo_ops_size);
+}
+
+void init_bxl_tables() {
+ memmove(cmd_tokens + last_command + 1, bxl_cmds, bxl_cmd_size);
+ memmove(op_tokens + last_operator + 1, bxl_ops, bxl_ops_size);
+}
+
+/* BXE's token table is identical to BXL's, and the commands are the
+ same up to token 0x56 (FAST). */
+void init_bxe_tables() {
+ init_bxl_tables();
+ memmove(cmd_tokens + 0x57, bxe_cmds, bxe_cmd_size);
+}
+
+void init_token_tables() {
+ if(bas_type == B_APLUS) {
+ init_aplus_tables();
+ return;
+ } else if(bas_type == B_INT_C) {
+ init_int_tables();
+ return;
+ } else if(bas_type == B_INT_D) {
+ init_int_disk_tables();
+ return;
+ }
+
+ init_bas_tables();
+
+ if(bas_type == B_TURBO)
+ init_turbo_tables();
+ else if(bas_type == B_BXL)
+ init_bxl_tables();
+ else if(bas_type == B_BXE)
+ init_bxe_tables();
+
+ if(dump_tables) {
+ int i;
+ printf("commands:\n\n");
+ for(i = 0; i < 0x65; i++)
+ printf("%s $%02x\n", (cmd_tokens[i] ? cmd_tokens[i] : "(null)"), i);
+ printf("operators:\n\n");
+ for(i = 0x12; i < 0x69; i++)
+ printf("%s $%02x\n", (op_tokens[i] ? op_tokens[i] : "(null)"), i);
+ exit(0);
+ }
+}
+
+void set_bas_dialect(int d) {
+ if(verbose)
+ fprintf(stderr, "set_bas_dialect(%d)\n", d);
+
+ switch(d) {
+ case 0:
+ case 1:
+ die("whichbas child process failed");
+ break;
+ case SRET_ATARI:
+ case SRET_APLUS:
+ case SRET_TURBO:
+ case SRET_BXL:
+ case SRET_BXE:
+ case SRET_OSSINT_CART:
+ case SRET_OSSINT_DISK:
+ bas_type = d;
+ break;
+ case SRET_AMSB:
+ die("This is an Atari Microsoft BASIC program. Use listamsb.");
+ break;
+ case SRET_COMPILED_TURBO:
+ case SRET_NOT_BASIC:
+ die("This is not any kind of BASIC program I know about.");
+ break;
+ default:
+ fprintf(stderr, "whichbas results ambiguous; guessing Turbo BASIC\n");
+ bas_type = SRET_TURBO;
+ break;
+ }
+}
+
+void detect_bas_dialect() {
+ pid_t pid, status;
+ int wstatus;
+ const char *args[4];
+
+ args[0] = "whichbas";
+ args[1] = "-s";
+ args[2] = input_filename;
+ args[3] = 0;
+
+ pid = fork();
+ if(pid == -1) {
+ perror("fork()");
+ die("Can't spawn child process");
+ } else if(pid) {
+ /* we are the parent */
+ status = waitpid(pid, &wstatus, 0);
+ if(status < 0) {
+ perror("waitpid()");
+ die("Child process went south");
+ }
+ if(!WIFEXITED(wstatus)) {
+ die("Child process went south");
+ }
+ set_bas_dialect(WEXITSTATUS(wstatus));
+ } else {
+ /* we are the child */
+ if(execvp(args[0], (char * const *)args) < 0) {
+ perror("Can't execute whichbas");
+ exit(1);
+ }
+ }
+}
+
+void init_bas_dialect() {
+ if(autodetect)
+ detect_bas_dialect();
+
+ if(bas_type == B_INT_C || bas_type == B_INT_D) {
+ numconst_size = 2;
+ if(bas_type == B_INT_C)
+ error_token = 0x38;
+ else
+ error_token = 0x36;
+ allow_hex_const = 1;
+ mixed_case = 1;
+ }
+
+ if(bas_type == B_TURBO || bas_type == B_BXL || bas_type == B_BXE)
+ allow_hex_const = 1;
+
+ if(bas_type == B_APLUS)
+ error_token = 0x53;
+
+ if(bas_type == B_BXL)
+ bxl_exttok_hack = 1;
+
+ if(bas_type == B_ATARI || bas_type == B_APLUS || bas_type == B_TURBO)
+ mixed_case = 0;
+
+ if(bas_type == B_ATARI)
+ indent = 0;
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_env_args();
+ parse_args(argc, argv, 0);
+
+ init_bas_dialect();
+ init_token_tables();
+
+ readfile();
+ parse_header();
+
+ if(!vntable_ok())
+ die("Program is variable-protected; unprotect it first.");
+
+ setup_outfh();
+ list();
+
+ if(badtok) {
+ fprintf(stderr, "%s: Program has unknown tokens; wrong BASIC dialect?\n", self);
+ return 2;
+ }
+
+ return 0;
+}
diff --git a/listbas.rst b/listbas.rst
new file mode 100644
index 0000000..d15792b
--- /dev/null
+++ b/listbas.rst
@@ -0,0 +1,417 @@
+=======
+listbas
+=======
+
+--------------------------------------------------------
+List the source of a tokenized Atari 8-bit BASIC program
+--------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+listbas [**-a** | **-d** | **-m** | **-x** | **-U**] [**-B**] [**-u**] [**-i**] [**-l**] [**-n** | **-C**] [**-v**] [**-c** *colors*] [**-r** *line-range*] **input-file**
+
+DESCRIPTION
+===========
+
+**listbas** acts like the *LIST* command in BASIC. It reads a
+tokenized (SAVEd) BASIC program and prints the code in human-readable
+format.
+
+By default, output is Unicode in UTF-8 encoding, with ANSI/VT220
+escape sequences for inverse video and color syntax highlighting.
+
+**listbas** supports several BASIC dialects used on the Atari. By
+default, the BASIC dialect is autodetected by running **whichbas**\(1)
+as an external process. To override this, see the **-b** option, below.
+
+Note: OSS Integer BASIC is *not* to be confused with Apple II Integer BASIC!
+
+OPTIONS
+=======
+
+BASIC options
+-------------
+
+**-b**
+ Set the BASIC dialect the program will be treated as. This disables
+ autodetection. Supported dialects are:
+
+ **-ba**
+ Atari BASIC.
+
+ **-ba+**
+ OSS BASIC/A+.
+
+ **-bic**
+ OSS Integer BASIC, cartridge version.
+
+ **-bid**
+ OSS Integer BASIC, disk version (uses different tokens from the cart).
+
+ **-bt**
+ Turbo BASIC XL.
+
+ **-bxl**
+ OSS BASIC XL.
+
+ **-bxe**
+ OSS BASIC XE.
+
+ See **BASIC DIALECTS** below for details.
+
+**-r** *line-range*
+ Show only part of the listing. *line-range* can be a single line, or
+ a comma-separated pair of starting and ending line numbers (e.g. **100,200**).
+ If the start line number is omitted (e.g. **,100**), it will be treated as
+ **0** (meaning, list from the beginning of the program). If the ending line
+ number is omitted (e.g. **100,**), it means "list until the end of the program".
+ **-r,** is equivalent to not using the **-r** option at all.
+
+**-i**
+ Include the immediate mode command (line 32768) in the output. This option has no
+ effect if the **-r** option is used to stop listing before the end of the program.
+
+**-l**
+ Do not print line numbers at the start of each line. **GOTO**, **GOSUB**,
+ **TRAP**, and **THEN** target line numbers are still printed.
+
+**-t**
+ Do not indent, if the program is Turbo BASIC, BASIC/A+, BASIC XL, or BASIC XE.
+ By default, indentation is enabled for everything but Atari BASIC.
+ If you want to indent an Atari BASIC program, use **-bt** or **-bxe**.
+ Integer BASIC indentation is not yet supported.
+
+**-k**
+ Do not print keywords in mixed case (e.g. **Print**, **Graphics**),
+ for BASIC XL, BASIC XE, or Integer BASIC. Equivalent of **SET 5,0**.
+
+Output modes
+------------
+
+The default output mode is Unicode/UTF-8 representations of ATASCII
+characters.
+
+**-U**
+ Output Unicode/UTF-8 representations of ATASCII characters. This is
+ the default output mode; the **-U** option is provided so you can
+ override **-a**, **-d**, **-m**, **-x** in **LISTBAS_OPTS** (see
+ **ENVIRONMENT**, below).
+
+**-x**
+ Output Unicode/UTF-8 representations of the XL International Character
+ Set, rather than ATASCII.
+
+**-a**
+ Output raw ATASCII; no translation to the host character set. Must be
+ used with redirection or a pipe; **listbas** will not write ATASCII to the terminal.
+ ATASCII output does not support color (because ATASCII doesn't).
+
+**-m**
+ Output "magazine listing". See the **-m** option for **a8cat**\(1) for details.
+ Color is supported in this mode. No Unicode/UTF-8 characters are printed in
+ this mode.
+
+**-d**
+ Print dots rather than Unicode/UTF-8 characters. Color and inverse
+ video are still supported in this mode, but no Unicode/UTF8 characters
+ are printed. Use this only if your terminal *really* doesn't support
+ Unicode (e.g. **rxvt**\(1))... but even then, **-m** is preferred,
+ because you can't tell what the dots are supposed to represent.
+
+Other display options
+---------------------
+
+**-C**
+ Enable color syntax highlighting. This option is enabled by default;
+ the **-C** option is provided so you can override **-n** in
+ **LISTBAS_OPTS** (see **ENVIRONMENT**, below).
+
+**-n**
+ No color. Has no effect if **-a** is in effect, since this
+ mode doesn't support color anyway. Disabling color does not
+ disable reverse video.
+
+**-B**
+ Use bold for color output. This may make it easier to read on
+ some terminals. Or, it may hurt your eyes...
+
+**-u**
+ Use underlining for inverse video, rather than reverse video output.
+
+**-c** *colors*
+ Customize the color scheme. See **COLORS**, below, for the format of the
+ *colors* argument. Once you've found a set of colors you like,
+ you can place this option in the **LISTBAS_OPTS** environment variable
+ to use your colors by default. See **ENVIRONMENT**, below.
+
+.. include:: genopts.rst
+
+BASIC DIALECTS
+==============
+
+Note that Turbo, BASIC XL, and BASIC XE are all proper supersets of
+Atari BASIC, so you can view an Atari BASIC program with any of
+**-bt**, **-bxl**, or **-bxe**. Also, BASIC XE is a superset of BASIC XL
+(provided BASIC XL's disk-based toolkit extended commands are not used),
+so you can usually use **-bxe** on a BASIC XL program.
+
+BASIC/A+ uses incompatible tokens, so its programs can't be viewed as
+any of the others. Trying to do this results in a very funny-looking
+listing, with commands like **POSITION** with no arguments (or with a
+string argument, or **POSITION #6;"string"**; it so happens A+ uses the
+same token number for **POSITION** that the other BASICs use for
+**?**). The same thing would happen if you booted BASIC/A+ on an Atari
+and tried to **LOAD** an Atari BASIC program. I can't help but think
+this is a major reason BASIC/A+ didn't sell that well (fortunately,
+OSS realized their mistake and fixed it in BASIC XL).
+
+OSS Integer BASIC also uses incompatible tokens. However, it uses a
+different signature (first byte of file is **$77**), so it will be
+reliably autodetected. The disk and cartridge versions of Integer
+BASIC use different tokens; this is also autodetected pretty
+reliably. If the code doesn't make sense, try **-bic** or **-bid**
+to override the autodetection.
+
+If you see lots of "bad token XX" messages, or if the code
+just doesn't make any sense, you're using the wrong BASIC
+option. **whichbas**\(1) can usually detect the BASIC a program was
+written in, but if the results are ambiguous, **listbas** will assume
+Turbo BASIC XL. If this is wrong, use **-bxl** or **-bxe** to force
+the issue.
+
+COLORS
+======
+
+Color output only works on terminal emulators (or real terminals)
+that support ANSI/VT220 style escape codes. This includes all modern
+terminal emulators, and most not-so-modern ones in the UNIX world. See
+**NOTES** for a list of tested terminal emulators.
+
+You can customize the colors by using the **-c** *colors* option, either
+on the command line, or in the **LISTBAS_OPTS** environment variable.
+*colors* is a string of exactly 8 characters, each of which must be the
+digits *0* through *7* to specify a color, or the letter *n* to specify
+no color.
+
+The colors are the standard ANSI ones, plus *n*:
+
+*0*
+ Black.
+
+*1*
+ Red.
+
+*2*
+ Green.
+
+*3*
+ Yellow (or brown/orange, on some terminals).
+
+*4*
+ Blue.
+
+*5*
+ Purple (aka violet).
+
+*6*
+ Cyan.
+
+*7*
+ White.
+
+*n*
+ No custom color. Output will be in the terminal's default foreground color.
+
+The order they're used in the *colors* argument is:
+
+**1**
+ BASIC keywords. Default: *3* (yellow).
+
+**2**
+ Operators, including quotes around strings and commas between **DATA** items. Default: *2* (green).
+
+**3**
+ Functions. Default: *5* (purple).
+
+**4**
+ Constants (numeric or string). Default: *1* (red).
+
+**5**
+ Line numbers (at the start of a line only; **GOTO** and **GOSUB** line numbers
+ are constants). Default: *6* (cyan).
+
+**6**
+ **REM** text. Default: *4* (blue).
+
+**7**
+ **DATA** items (but not the commas between them). Default: *6* (cyan).
+
+**8**
+ Variable names. Default: *n* (uncolorized).
+
+So, the default color scheme is equivalent to:
+
+ **-c** *3251646n*
+
+Black and white are not used by default because presumably, one or the
+other is the background color of the terminal.
+
+NOTES
+=====
+
+Indentation
+-----------
+
+The indentation isn't all that well-tested yet, but so far it seems work
+correctly. The **-t** option is the equivalent of **\*L\ -** for Turbo,
+or **SET 12,0** for BXL/BXE. The different BASICs have different
+indentation rules; try viewing the same Atari BASIC program with
+**-bt**, **-bxl**, and **-bxe** to compare them.
+
+**listbas -t** is also (as far as I know) the only way to **LIST**
+a BASIC/A+ program without indentation, since BASIC/A+ itself doesn't
+have a way to disable it.
+
+Turbo BASIC, at least, will "max out" the indentation level at some
+point. Once there are 60 or so levels of indent, it stops adding
+more. **listbas** doesn't emulate this behaviour (shouldn't be a
+problem, it's a pathological case).
+
+BASIC XL actually does indentation within a line. If you write::
+
+ 10 IF A:IF B:IF C:REM
+
+...BXL lists it as::
+
+ 10 If A: If B: If C:Rem
+
+**listbas** only indents at the start of a line, so this behaviour is
+not emulated.
+
+One thing **listbas** gets right: the **LIST** command in Turbo, A+,
+BXL, and BXE always starts out with 0 indent spaces, if you're only
+listing part of a program. BXE example::
+
+ 10 While 1
+ 20 If Peek(764)<>255
+ 30 ? "SOMEONE PRESSED A KEY":Poke 764,255
+ 40 Endif
+ 50 Endwhile
+
+...but if you give a **LIST 30** in BXE, you'll get line 30 without any
+indentation. **listbas** does this, too, if you use the **-r** option.
+
+Protected Programs
+------------------
+
+**listbas** will refuse to operate on a LIST-protected program with
+scrambled variable names. For code-protected programs, it will stop at
+the line with the invalid offset. Use **unprotbas**\(1) to remove the
+protection.
+
+Comparison to chkbas
+--------------------
+
+**listbas** is similar to Jindroush's **chkbas**\(1). The main differences are:
+
+- **listbas** prints ATASCII graphics as Unicode equivalents, so the listing
+ looks very similar to how it would appear on the Atari.
+
+- **listbas** does color syntax highlighting.
+
+- **listbas** supports OSS BASIC/A+ and Integer BASIC in addition to Turbo and BXL/BXE.
+
+- **listbas** indents BASIC/A+, Turbo, BXL, and BXE code, just like the
+ actual BASICs do.
+
+- **listbas** doesn't show information about the variables. Use **vxrefbas**\(1)
+ for that.
+
+- **listbas** will not write ATASCII data to your terminal. By default, it
+ converts ATASCII characters into Unicode/UTF-8 characters
+ that won't confuse the terminal. When outputting raw ATASCII (**-a** option),
+ it refuses to run if standard output is a terminal.
+
+- **listbas** only lists line 32768 (the immediate mode command) if
+ specifically asked to do so.
+
+- **listbas** doesn't print a banner on startup.
+
+- **listbas** tells you if the program is protected, and refuses to operate
+ on variable-protected programs. For code-protected programs, it lists
+ the program up to the "poisoned" line (normally the last line).
+
+Terminal Support
+----------------
+
+The color and inverse/bold/underline support assumes your terminal supports
+ANSI/VT220 escape codes... but it does *not* use **curses**\(3X) or
+**terminfo**\(5), or even look at **TERM** in the environment. It just
+blindly emits the escape codes. Likewise, Unicode characters are printed
+in UTF-8 encoding, without actually checking whether the terminal or the
+current locale supports UTF-8.
+
+**listbas** has been tested and is known to work in at least these
+terminals:
+
+ **rxvt-unicode**, aka **urxvt**. This is the terminal the author uses.
+
+ **xterm** - tested frequently. Requires the XTerm.locale resource
+ to be set to **UTF-8** (e.g. in **~/.Xdefaults**\), or the **-lc**
+ and/or **-en UTF-8** command line options.
+
+ **Linux console** - works fine, but good luck finding a font with
+ all the Unicode graphics characters. Better use **-m**.
+
+ **kitty** - very fancy terminal emulator that supports both X11 and
+ Wayland. **listbas** was only tested on X11.
+
+ **xfce4-terminal** - version 0.8.10, with XFCE4 4.16.0.
+
+ **konsole** - the KDE terminal, from KDE 5.90.
+
+ **gnome-terminal** - version 3.43.90.
+
+ **st** - minimal terminal from suckless.org, version 0.9.2.
+
+ **mlterm** - version 3.9.3.
+
+ **kmscon** - version 9.0.0. https://github.com/Aetf/kmscon
+
+ **fbterm** - version 1.8. https://github.com/sfzhi/fbterm
+
+Also, **rxvt** and **aterm** don't support Unicode, but they will
+otherwise work (display color and inverse) with the **-m** or **-d**
+options to **listbas**.
+
+HTML Output
+-----------
+
+See **abas2html**\(1).
+
+ENVIRONMENT
+===========
+
+**LISTBAS_OPTS**
+ If this environment variable is set, **listbas** parses its value as though
+ the contents were placed on the command line as options, preceding any actual
+ option. Example::
+
+ export LISTBAS_OPTS="-c123456 -d"
+
+ If you place the above line in your shell's startup script, **listbas** will
+ use your custom color scheme, and will default to the "dots" output mode. If
+ you then run **listbas** the **-c** and/or **-x**, **-m** options, the options
+ on the command line will override the environment.
+
+EXIT STATUS
+===========
+
+0 for success, 1 if there was an error reading the input (e.g. file
+not found), or 2 if the input file has invalid tokens (if this
+happens, you will also see a warning about it on stderr).
+
+.. include:: manftr.rst
diff --git a/manftr.rst b/manftr.rst
index 12e78d2..0d38695 100644
--- a/manftr.rst
+++ b/manftr.rst
@@ -11,25 +11,39 @@ B. Watson <urchlay@slackware.uk>; Urchlay on irc.libera.chat *##atari*.
SEE ALSO
========
-**a8eol**\(1),
-**a8utf8**\(1),
-**atr2xfd**\(1),
-**atrsize**\(1),
+**a8cat**\(1),
+**a8eol**\(1),
+**a8xd**\(1),
+**atr2xfd**\(1),
+**atrsize**\(1),
**axe**\(1),
-**blob2c**\(1),
-**blob2xex**\(1),
-**cart2xex**\(1),
-**dasm2atasm**\(1),
-**f2toxex**\(1),
-**fenders**\(1),
-**rom2cart**\(1),
+**bas2aplus**\(1),
+**blob2c**\(1),
+**blob2xex**\(1),
+**cart2xex**\(1),
+**cxrefbas**\(1),
+**dasm2atasm**\(1),
+**diffbas**\(1),
+**dumpbas**\(1),
+**f2toxex**\(1),
+**fenders**\(1),
+**listbas**\(1),
+**listamsb**\(1),
+**protbas**\(1),
+**renumbas**\(1),
+**rom2cart**\(1),
**unmac65**\(1),
-**xexamine**\(1),
-**xexcat**\(1),
-**xexsplit**\(1),
+**unprotbas**\(1),
+**vxrefbas**\(1),
+**whichbas**\(1),
+**xex1to2**\(1),
+**xexamine**\(1),
+**xexcat**\(1),
+**xexsplit**\(1),
**xfd2atr**\(1),
**xex**\(5),
-**atascii**\(7).
+**atascii**\(7),
+**fauxtari**\(7).
Any good Atari 8-bit book: *De Re Atari*, *The Atari BASIC Reference
Manual*, the *OS Users' Guide*, *Mapping the Atari*, etc.
diff --git a/manhdr5.rst b/manhdr5.rst
new file mode 100644
index 0000000..e0b3c67
--- /dev/null
+++ b/manhdr5.rst
@@ -0,0 +1,7 @@
+.. include:: ver.rst
+.. |date| date::
+
+:Manual section: 5
+:Manual group: Urchlay's Atari 8-bit Tools
+:Date: |date|
+:Version: |version|
diff --git a/mkatables.pl b/mkatables.pl
new file mode 100644
index 0000000..231dcbb
--- /dev/null
+++ b/mkatables.pl
@@ -0,0 +1,161 @@
+#!/usr/bin/perl -w
+
+%atascii = (
+ 0 => "♥",
+ 1 => "┣",
+ 2 => "┃",
+ 3 => "┛",
+ 4 => "┫",
+ 5 => "┓",
+ 6 => "╱",
+ 7 => "╲",
+ 8 => "◢",
+ 9 => "▗",
+ 10 => "◣",
+ 11 => "▝",
+ 12 => "▘",
+ 13 => "▔",
+ 14 => "▁",
+ 15 => "▖",
+ 16 => "♣",
+ 17 => "┏",
+ 18 => "━",
+ 19 => "╋",
+ 20 => "●",
+ 21 => "▄",
+ 22 => "▎",
+ 23 => "┳",
+ 24 => "┻",
+ 25 => "▌",
+ 26 => "┗",
+ 27 => "Ę",
+ 28 => "↑",
+ 29 => "↓",
+ 30 => "←",
+ 31 => "→",
+ 34 => "\\\"",
+ 92 => "\\\\",
+ 96 => "◆",
+ 123 => "♠",
+ 125 => "↰",
+ 126 => "◀",
+ 127 => "▶",
+);
+
+%xl = (
+ 0 => "á",
+ 1 => "ù",
+ 2 => "Ñ",
+ 3 => "É",
+ 4 => "ç",
+ 5 => "ô",
+ 6 => "ò",
+ 7 => "ì",
+ 8 => "£",
+ 9 => "ï",
+ 10 => "ü",
+ 11 => "ä",
+ 12 => "Ö",
+ 13 => "ú",
+ 14 => "ó",
+ 15 => "ö",
+ 16 => "Ü",
+ 17 => "â",
+ 18 => "û",
+ 19 => "î",
+ 20 => "é",
+ 21 => "è",
+ 22 => "ñ",
+ 23 => "ê",
+ 24 => "ȧ",
+ 25 => "à",
+ 26 => "Ȧ",
+ 27 => "Ę",
+ 28 => "↑",
+ 29 => "↓",
+ 30 => "←",
+ 31 => "→",
+ 34 => "\\\"",
+ 92 => "\\\\",
+ 96 => "¡",
+ 123 => "Ä",
+ 125 => "↰",
+ 126 => "◀",
+ 127 => "▶",
+);
+
+%magazine = (
+ 0 => "{ctrl-,}",
+ 1 => "{ctrl-A}",
+ 2 => "{ctrl-B}",
+ 3 => "{ctrl-C}",
+ 4 => "{ctrl-D}",
+ 5 => "{ctrl-E}",
+ 6 => "{ctrl-F}",
+ 7 => "{ctrl-G}",
+ 8 => "{ctrl-H}",
+ 9 => "{ctrl-I}",
+ 10 => "{ctrl-J}",
+ 11 => "{ctrl-K}",
+ 12 => "{ctrl-L}",
+ 13 => "{ctrl-M}",
+ 14 => "{ctrl-N}",
+ 15 => "{ctrl-O}",
+ 16 => "{ctrl-P}",
+ 17 => "{ctrl-Q}",
+ 18 => "{ctrl-R}",
+ 19 => "{ctrl-S}",
+ 20 => "{ctrl-T}",
+ 21 => "{ctrl-U}",
+ 22 => "{ctrl-V}",
+ 23 => "{ctrl-W}",
+ 24 => "{ctrl-X}",
+ 25 => "{ctrl-Y}",
+ 26 => "{ctrl-Z}",
+ 27 => "{esc}",
+ 28 => "{up}",
+ 29 => "{down}",
+ 30 => "{left}",
+ 31 => "{right}",
+ 34 => "\\\"",
+ 92 => "\\\\",
+ 96 => "{ctrl-.}",
+ 123 => "{ctrl-;}",
+ 125 => "{clear}",
+ 126 => "{bksp}",
+ 127 => "{tab}",
+ # the remaining control characters (with high bit set)
+ # are special-cased in a8cat.c
+);
+
+sub getcharname {
+ my $c = shift;
+ if($c == 127) {
+ return "[del]";
+ } elsif($c < 32) {
+ return "^" . chr($c + 64);
+ } else {
+ return chr($c);
+ }
+}
+
+sub mktable {
+ my ($name, $hash) = @_;
+
+ print "const char *$name\[\] = {\n";
+ for (0..127) {
+ my $cmt = sprintf("/* %3d \$%02x %5s */", $_, $_, getcharname($_));
+ print "\t\"" . ($hash->{$_} || chr($_)), "\", $cmt\n";
+ }
+ print "};\n\n";
+}
+
+print <<EOF;
+/* ATASCII to UTF-8 tables. Generated by mkatables.pl.
+ Do not edit this file; edit mkatables.pl instead. */
+
+EOF
+
+mktable("ata2utf", \%atascii);
+mktable("ics2utf", \%xl);
+mktable("ata2mag", \%magazine);
diff --git a/ossintbas.7 b/ossintbas.7
new file mode 100644
index 0000000..dda00d3
--- /dev/null
+++ b/ossintbas.7
@@ -0,0 +1,582 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "OSSINTBAS" 7 "2025-03-25" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+ossintbas \- OSS Integer BASIC Notes
+.SH DESCRIPTION
+.sp
+OSS Integer BASIC is a BASIC interpreter from OSS, similar to BASIC XL
+and BASIC XE. It was never released as a commercial product, and was
+eventually released into the Public Domain.
+.sp
+It appears to be complete and free of major bugs. There is no manual
+for it, so I\(aqm documenting the differences between Integer BASIC and
+BASIC XL/XE here, as I discover them.
+.sp
+For more info on the release:
+.INDENT 0.0
+.INDENT 3.5
+\fI\%https://forums.atariage.com/topic/257029\-oss\-d\-day\-part\-3\-integer\-basic\-source\-code\-now\-in\-pd/\fP
+.UNINDENT
+.UNINDENT
+.SH NUMERICS
+.sp
+All numbers are signed 16\-bit integers. There is no floating point support
+at all.
+.sp
+Two\(aqs complement is used, so bit 15 is the sign bit, and \fI\-1\fP is
+represented as \fI$FFFF\fP\&.
+.sp
+The range is \fI\-32768\fP to \fI32767\fP\&. Somewhat confusingly (but also
+usefully), positive numbers in the range \fI32768\fP to \fI65535\fP can be
+entered in program code, or as response to \fBINPUT\fP, etc... but when
+they are \fBPRINT\fPed, they will appear as negative numbers. This
+is unlike Apple\(aqs Integer BASIC, for instance. It was probably done
+so that BASIC code could use the familiar memory locations. Example:
+\fBPEEK(53279)\fP to read the console keys. It would be very annoying if
+this had to be written as \fBPEEK(\-12257)\fP\&... although it does work
+if written that way (Apple\-style).
+.sp
+Although floating point is not supported, it\(aqs possible to enter
+numbers with a decimal point or even scientific notation. These will
+silently be converted to integers, with rounding. If the result is
+outside the range \fI\-32768\fP to \fI65535\fP, you\(aqll get an \fBERROR\- 3\fP\&.
+This applies to numbers entered as part of the program as well as
+those entered in response to \fBINPUT\fP, or \fBREAD\fP from \fBDATA\fP
+lines.
+.SH COMMANDS
+.sp
+\fBVBLANKWAIT\fP
+.INDENT 0.0
+.INDENT 3.5
+Pause and wait for a vertical blank interrupt to occur.
+.sp
+Abbreviation: \fBV.\fP
+.UNINDENT
+.UNINDENT
+.sp
+\fBVINC\fP \fI<var>\fP
+.INDENT 0.0
+.INDENT 3.5
+Increment (add 1 to) a variable. This is about 30% faster than
+\fBA=A+1\fP\&.
+.sp
+Abbreviation: \fBVI.\fP
+.UNINDENT
+.UNINDENT
+.sp
+\fBVDEC\fP \fI<var>\fP
+.INDENT 0.0
+.INDENT 3.5
+Decrement (subtract 1 from) a variable. Faster than \fBA=A\-1\fP\&.
+.sp
+Abbreviation: \fBVD.\fP
+.UNINDENT
+.UNINDENT
+.sp
+\fBVCONST\fP \fI<num>\fP, \fI<var>\fP
+.INDENT 0.0
+.INDENT 3.5
+Add a constant to \fIvar\fP\&. There are 8 constants, numbered 0 through
+7. They are set with the \fBSET\fP command, using arguments 16 to 23
+to set the constants. Example: \fBSET 16,10\fP sets constant 0 to 123,
+and \fBVCONST 0,A\fP adds 10 to A.
+.sp
+If \fI<num>\fP is greater than 7, the variable will be
+unchanged. \fBSET\fP won\(aqt accept a number higher than 23 for its first
+argument, so there\(aqd be no way to set any constants other than 0
+to 7 anyway.
+.sp
+When Integer BASIC first starts up, the constants are initialized
+to what amounts to garbage values. You can examine them with
+\fBSYS(16)\fP through \fBSYS(23)\fP, but it\(aqs a bad idea to depend on
+them because the values are different between the disk and cartridge
+versions of Integer BASIC.
+.sp
+Using VCONST is about 15% faster than just adding a number to a
+variable.
+.sp
+Abbreviation: \fBVC.\fP
+.UNINDENT
+.UNINDENT
+.SH FUNCTIONS
+.sp
+\fBRUN(0)\fP
+.INDENT 0.0
+.INDENT 3.5
+Returns the run (coldstart) address of the interpreter. \fB? USR(RUN(0))\fP
+restarts Integer BASIC. The \fI0\fP is a \(aqdummy\(aq argument (ignored, like \fBFRE(0)\fP).
+.UNINDENT
+.UNINDENT
+.SH OPERATORS
+.sp
+\fB!\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary OR. Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB&\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary AND. Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB%\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary exclusive OR (XOR). Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB<<\fP
+.INDENT 0.0
+.INDENT 3.5
+Left shift, like C. Infix operator. Result is the expression on the left,
+shifted left by the number of bits on the right. Examples: \fB1<<4\fP
+is 16, \fB255<<1\fP is 510.
+.sp
+Bits shifted off the left end of the number are lost. Zeroes are
+shifted in, for the low\-order bit(s). Shifting anything left 16 times
+results in zero. Since bit 15 is the sign bit, shifting a 1 into bit
+15 will result in a negative number.
+.UNINDENT
+.UNINDENT
+.sp
+\fB>>\fP
+.INDENT 0.0
+.INDENT 3.5
+Right shift, like C. Infix operator. Result is the expression
+on the left, shifted to the right, by the number of bits on the
+right. Examples: \fB16>>4\fP is 1, \fB255>>1\fP is 127.
+.sp
+Bits shifted off the right end of the number are lost. Zeroes are
+shifted in, for the high\-order bit(s). Shifting any negative number
+to the right will result in a positive numbers, since a zero will be
+shifted into the sigh bit.
+.UNINDENT
+.UNINDENT
+.sp
+\fB^&\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary NAND. Like AND, but inverts the bits in the result. Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB^!\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary NOR. Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB^%\fP
+.INDENT 0.0
+.INDENT 3.5
+Binary NXOR. Infix operator.
+.UNINDENT
+.UNINDENT
+.sp
+\fB\e\fP
+.INDENT 0.0
+.INDENT 3.5
+Modulus. Infix operator. Result of \fBX&Y\fP is the remainder of \fBX/Y\fP\&.
+.sp
+\fINOTE\fP that this is \fBbroken\fP in the cartridge version of Integer BASIC,
+though it works correctly in the disk version. See \fBBUGS\fP, below.
+.UNINDENT
+.UNINDENT
+.SH COMPATIBILITY
+.sp
+Integer BASIC can\(aqt LOAD programs that were SAVEd by any other BASIC,
+and programs SAVEd by Integer BASIC can\(aqt be LOADed in any other
+BASIC. Use LIST and ENTER instead.
+.sp
+Actually, the disk and cartridge versions of Integer BASIC can\(aqt even
+LOAD each others\(aq programs. They use a different set of token numbers.
+This is because the cartridge version includes the \fBHITCLR\fP command,
+but the disk version does not.
+.sp
+The \fBINT()\fP function exists in Integer BASIC, but it doesn\(aqt actually
+do anything. Seems to be provided for compatibility with other BASICs.
+.SS Missing Commands
+.sp
+Integer BASIC has the full command set of the BASIC XL cartridge,
+minus these commands:
+.sp
+\fBDEG\fP \fBRAD\fP \fBRGET\fP \fBRPUT\fP
+.sp
+The cartridge version of Integer BASIC has the \fBHITCLR\fP command
+(from BASIC XE), but the disk version does not.
+.sp
+The BASIC XL extension disk commands (\fBLOCAL\fP, \fBEXIT\fP,
+\fBPROCEDURE\fP, \fBCALL\fP, \fBSORTUP\fP, and \fBSORTDOWN\fP) don\(aqt exist in
+Integer BASIC. If there was ever an extensions disk for Integer BASIC,
+nobody\(aqs found it yet.
+.sp
+The extra commands in BASIC XE (\fBEXTEND\fP, \fBINVERSE\fP, \fBNORMAL\fP,
+\fBBLOAD\fP, and \fBBSAVE\fP) are not supported.
+.SS Missing Operators/Functions
+.INDENT 0.0
+.TP
+.B \fB^\fP
+There is no exponentiation operator; \fB2^2\fP is a syntax error.
+.TP
+.B \fBATN()\fP, \fBCLOG()\fP, \fBCOS()\fP, \fBEXP()\fP, \fBLOG()\fP, \fBSIN()\fP
+There are no trigonometric functions in Integer BASIC. These can
+be used as array variable names, if you wish.
+.TP
+.B \fBUSING\fP
+BASIC XL and XE\(aqs "PRINT USING" doesn\(aqt exist in Integer BASIC.
+.UNINDENT
+.SH PERFORMANCE
+.sp
+OSS Integer BASIC is \fIfast\fP, compared to other interpreted BASICs on
+the Atari. It even outperforms Turbo BASIC XL (though, not \fIcompiled\fP
+Turbo).
+.sp
+For testing, I used a modified version of the Sieve of Eratosthenes
+program, found in the source for \fBbas55\fP\&. The program finds and
+prints all the prime numbers between 2 and 1000. The code:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 POKE 18,0:POKE 19,0:POKE 20,0
+20 DIM A(1000)
+30 N=1000
+100 S=SQR(N)
+110 FOR I=2 TO S
+120 IF A(I)=1 THEN 170
+130 D=N/I
+140 FOR J=I TO D
+150 A(I*J)=1
+160 NEXT J
+170 NEXT I
+180 FOR I=2 TO N
+190 IF A(I)=1 THEN 210
+200 PRINT I
+210 NEXT I
+1000 PRINT PEEK(18)*256*256+PEEK(19)*256+PEEK(20)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Line 1000 prints how many jiffies the program took to run. I used
+Atari800 5.2.0 emulating an NTSC Atari 800XL, so one jiffy is 1/60 of
+a second. The "Fastchip" results use Charles Marslet\(aqs OS floating
+point replacement ROM. For Integer BASIC, BASIC XL and BASIC XE,
+separate runs were done with the line \fB5 FAST\fP at the start of the
+program. Results:
+.TS
+center;
+|l|l|l|.
+_
+T{
+BASIC
+T} T{
+Jiffies
+T} T{
+Speedup
+T}
+_
+T{
+Atari 8K
+T} T{
+1867
+T} T{
+\-\-
+T}
+_
+T{
+A+
+T} T{
+1671
+T} T{
+1.12
+T}
+_
+T{
+Atari 8K (Fastchip)
+T} T{
+1587
+T} T{
+1.18
+T}
+_
+T{
+A+ (Fastchip)
+T} T{
+1569
+T} T{
+1.19
+T}
+_
+T{
+XE
+T} T{
+1440
+T} T{
+1.3
+T}
+_
+T{
+AMSB2
+T} T{
+1518
+T} T{
+1.23
+T}
+_
+T{
+XL
+T} T{
+1270
+T} T{
+1.47
+T}
+_
+T{
+Altirra
+T} T{
+1166
+T} T{
+1.67
+T}
+_
+T{
+XL (FAST)
+T} T{
+1110
+T} T{
+1.68
+T}
+_
+T{
+XL (Fastchip)
+T} T{
+1049
+T} T{
+1.78
+T}
+_
+T{
+XL (Fastchip, FAST)
+T} T{
+887
+T} T{
+2.1
+T}
+_
+T{
+Turbo
+T} T{
+825
+T} T{
+2.3
+T}
+_
+T{
+XE (FAST)
+T} T{
+777
+T} T{
+2.4
+T}
+_
+T{
+XE (Fastchip, FAST)
+T} T{
+777
+T} T{
+2.4
+T}
+_
+T{
+Altirra (Fastchip)
+T} T{
+769
+T} T{
+2.43
+T}
+_
+T{
+Integer
+T} T{
+719
+T} T{
+2.6
+T}
+_
+T{
+Integer (FAST)
+T} T{
+575
+T} T{
+3.25
+T}
+_
+.TE
+.sp
+Turbo BASIC XL, Atari Microsoft BASIC, and OSS Integer BASIC run at
+the same speed with or without the Fastchip ROM, since they don\(aqt use
+the OS floating point routines.
+.sp
+For reference, I rewrote the program in C and compiled it with
+cc65. It runs in 349 jiffies, 5.35x as fast as BASIC, with or without
+the Fastchip ROM. Since cc65 only supports integer arithmetic, this
+probably represents the theoretical maximum speed the algorithm could
+run in on the Atari, without rewriting it in assembly. By comparison,
+Integer BASIC looks pretty good.
+.sp
+If you get rid of lines 180 to 210 (don\(aqt print the results), Integer
+BASIC with FAST runs it in 245 jiffies, and the equivalent C program
+runs in 61 jiffies. This shows that CIO and the E: device are the
+"bottleneck" for this program (and that compiled C is still faster
+than anything interpreted).
+.SH BUGS
+.SS Modulo Arithmetic
+.sp
+The \fB\e\fP (modulus) operator returns incorrect results in the
+cartridge version of Integer BASIC. This program demonstrates the
+bug:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+10 For I=1 To 10
+20 ? I,I\e3,I\-(I/3)*3
+30 Next I
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+When run with the disk version, the results are correct:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+1 1 1
+2 2 2
+3 0 0
+4 1 1
+5 2 2
+6 0 0
+7 1 1
+8 2 2
+9 0 0
+10 1 1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The same program run with the cartridge version gives:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+1 254 1
+2 255 2
+3 0 0
+4 1 1
+5 2 2
+6 253 0
+7 254 1
+8 255 2
+9 0 0
+10 1 1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+This is obviously wrong.
+.sp
+If you\(aqre writing a real program in Integer BASIC, I recommend
+avoiding the \fB\e\fP operator entirely. Write something like \fBX\-X/Y*Y\fP
+instead.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/ossintbas.rst b/ossintbas.rst
new file mode 100644
index 0000000..38fe649
--- /dev/null
+++ b/ossintbas.rst
@@ -0,0 +1,14 @@
+=========
+ossintbas
+=========
+
+-----------------------
+OSS Integer BASIC Notes
+-----------------------
+
+.. include:: manhdr7.rst
+
+.. include:: ossintbas_content.rst
+
+.. include:: manftr.rst
+
diff --git a/ossintbas_content.rst b/ossintbas_content.rst
new file mode 100644
index 0000000..2289a84
--- /dev/null
+++ b/ossintbas_content.rst
@@ -0,0 +1,319 @@
+DESCRIPTION
+===========
+
+OSS Integer BASIC is a BASIC interpreter from OSS, similar to BASIC XL
+and BASIC XE. It was never released as a commercial product, and was
+eventually released into the Public Domain.
+
+It appears to be complete and free of major bugs. There is no manual
+for it, so I'm documenting the differences between Integer BASIC and
+BASIC XL/XE here, as I discover them.
+
+For more info on the release:
+
+ https://forums.atariage.com/topic/257029-oss-d-day-part-3-integer-basic-source-code-now-in-pd/
+
+NUMERICS
+========
+
+All numbers are signed 16-bit integers. There is no floating point support
+at all.
+
+Two's complement is used, so bit 15 is the sign bit, and *-1* is
+represented as *$FFFF*.
+
+The range is *-32768* to *32767*. Somewhat confusingly (but also
+usefully), positive numbers in the range *32768* to *65535* can be
+entered in program code, or as response to **INPUT**, etc... but when
+they are **PRINT**\ed, they will appear as negative numbers. This
+is unlike Apple's Integer BASIC, for instance. It was probably done
+so that BASIC code could use the familiar memory locations. Example:
+**PEEK(53279)** to read the console keys. It would be very annoying if
+this had to be written as **PEEK(-12257)**\... although it does work
+if written that way (Apple-style).
+
+Although floating point is not supported, it's possible to enter
+numbers with a decimal point or even scientific notation. These will
+silently be converted to integers, with rounding. If the result is
+outside the range *-32768* to *65535*, you'll get an **ERROR- 3**.
+This applies to numbers entered as part of the program as well as
+those entered in response to **INPUT**, or **READ** from **DATA**
+lines.
+
+COMMANDS
+========
+
+**VBLANKWAIT**
+
+ Pause and wait for a vertical blank interrupt to occur.
+
+ Abbreviation: **V.**
+
+**VINC** *<var>*
+
+ Increment (add 1 to) a variable. This is about 30% faster than
+ **A=A+1**.
+
+ Abbreviation: **VI.**
+
+**VDEC** *<var>*
+
+ Decrement (subtract 1 from) a variable. Faster than **A=A-1**.
+
+ Abbreviation: **VD.**
+
+**VCONST** *<num>*, *<var>*
+
+ Add a constant to *var*. There are 8 constants, numbered 0 through
+ 7. They are set with the **SET** command, using arguments 16 to 23
+ to set the constants. Example: **SET 16,10** sets constant 0 to 123,
+ and **VCONST 0,A** adds 10 to A.
+
+ If *<num>* is greater than 7, the variable will be
+ unchanged. **SET** won't accept a number higher than 23 for its first
+ argument, so there'd be no way to set any constants other than 0
+ to 7 anyway.
+
+ When Integer BASIC first starts up, the constants are initialized
+ to what amounts to garbage values. You can examine them with
+ **SYS(16)** through **SYS(23)**, but it's a bad idea to depend on
+ them because the values are different between the disk and cartridge
+ versions of Integer BASIC.
+
+ Using VCONST is about 15% faster than just adding a number to a
+ variable.
+
+ Abbreviation: **VC.**
+
+
+FUNCTIONS
+=========
+
+**RUN(0)**
+
+ Returns the run (coldstart) address of the interpreter. **? USR(RUN(0))**
+ restarts Integer BASIC. The *0* is a 'dummy' argument (ignored, like **FRE(0)**\).
+
+OPERATORS
+=========
+
+**!**
+
+ Binary OR. Infix operator.
+
+**&**
+
+ Binary AND. Infix operator.
+
+**%**
+
+ Binary exclusive OR (XOR). Infix operator.
+
+**<<**
+
+ Left shift, like C. Infix operator. Result is the expression on the left,
+ shifted left by the number of bits on the right. Examples: **1<<4**
+ is 16, **255<<1** is 510.
+
+ Bits shifted off the left end of the number are lost. Zeroes are
+ shifted in, for the low-order bit(s). Shifting anything left 16 times
+ results in zero. Since bit 15 is the sign bit, shifting a 1 into bit
+ 15 will result in a negative number.
+
+**>>**
+
+ Right shift, like C. Infix operator. Result is the expression
+ on the left, shifted to the right, by the number of bits on the
+ right. Examples: **16>>4** is 1, **255>>1** is 127.
+
+ Bits shifted off the right end of the number are lost. Zeroes are
+ shifted in, for the high-order bit(s). Shifting any negative number
+ to the right will result in a positive numbers, since a zero will be
+ shifted into the sigh bit.
+
+**^&**
+
+ Binary NAND. Like AND, but inverts the bits in the result. Infix operator.
+
+**^!**
+
+ Binary NOR. Infix operator.
+
+**^%**
+
+ Binary NXOR. Infix operator.
+
+**\\**
+
+ Modulus. Infix operator. Result of **X&Y** is the remainder of **X/Y**.
+
+ *NOTE* that this is **broken** in the cartridge version of Integer BASIC,
+ though it works correctly in the disk version. See **BUGS**, below.
+
+
+COMPATIBILITY
+=============
+
+Integer BASIC can't LOAD programs that were SAVEd by any other BASIC,
+and programs SAVEd by Integer BASIC can't be LOADed in any other
+BASIC. Use LIST and ENTER instead.
+
+Actually, the disk and cartridge versions of Integer BASIC can't even
+LOAD each others' programs. They use a different set of token numbers.
+This is because the cartridge version includes the **HITCLR** command,
+but the disk version does not.
+
+The **INT()** function exists in Integer BASIC, but it doesn't actually
+do anything. Seems to be provided for compatibility with other BASICs.
+
+Missing Commands
+----------------
+
+Integer BASIC has the full command set of the BASIC XL cartridge,
+minus these commands:
+
+**DEG** **RAD** **RGET** **RPUT**
+
+The cartridge version of Integer BASIC has the **HITCLR** command
+(from BASIC XE), but the disk version does not.
+
+The BASIC XL extension disk commands (**LOCAL**, **EXIT**,
+**PROCEDURE**, **CALL**, **SORTUP**, and **SORTDOWN**) don't exist in
+Integer BASIC. If there was ever an extensions disk for Integer BASIC,
+nobody's found it yet.
+
+The extra commands in BASIC XE (**EXTEND**, **INVERSE**, **NORMAL**,
+**BLOAD**, and **BSAVE**) are not supported.
+
+Missing Operators/Functions
+---------------------------
+
+**^**
+ There is no exponentiation operator; **2^2** is a syntax error.
+
+**ATN()**, **CLOG()**, **COS()**, **EXP()**, **LOG()**, **SIN()**
+ There are no trigonometric functions in Integer BASIC. These can
+ be used as array variable names, if you wish.
+
+**USING**
+ BASIC XL and XE's "PRINT USING" doesn't exist in Integer BASIC.
+
+PERFORMANCE
+===========
+
+OSS Integer BASIC is *fast*, compared to other interpreted BASICs on
+the Atari. It even outperforms Turbo BASIC XL (though, not *compiled*
+Turbo).
+
+For testing, I used a modified version of the Sieve of Eratosthenes
+program, found in the source for **bas55**. The program finds and
+prints all the prime numbers between 2 and 1000. The code::
+
+ 10 POKE 18,0:POKE 19,0:POKE 20,0
+ 20 DIM A(1000)
+ 30 N=1000
+ 100 S=SQR(N)
+ 110 FOR I=2 TO S
+ 120 IF A(I)=1 THEN 170
+ 130 D=N/I
+ 140 FOR J=I TO D
+ 150 A(I*J)=1
+ 160 NEXT J
+ 170 NEXT I
+ 180 FOR I=2 TO N
+ 190 IF A(I)=1 THEN 210
+ 200 PRINT I
+ 210 NEXT I
+ 1000 PRINT PEEK(18)*256*256+PEEK(19)*256+PEEK(20)
+
+Line 1000 prints how many jiffies the program took to run. I used
+Atari800 5.2.0 emulating an NTSC Atari 800XL, so one jiffy is 1/60 of
+a second. The "Fastchip" results use Charles Marslet's OS floating
+point replacement ROM. For Integer BASIC, BASIC XL and BASIC XE,
+separate runs were done with the line **5 FAST** at the start of the
+program. Results:
+
+.. csv-table::
+
+ "BASIC", "Jiffies", "Speedup"
+ "Atari 8K", "1867", "--"
+ "A+", "1671", "1.12"
+ "Atari 8K (Fastchip)", "1587", "1.18"
+ "A+ (Fastchip)", "1569", "1.19"
+ "XE", "1440", "1.3"
+ "AMSB2", "1518", "1.23"
+ "XL", "1270", "1.47"
+ "Altirra", "1166", "1.67"
+ "XL (FAST)", "1110", "1.68"
+ "XL (Fastchip)", "1049", "1.78"
+ "XL (Fastchip, FAST)", "887", "2.1"
+ "Turbo", "825", "2.3"
+ "XE (FAST)", "777", "2.4"
+ "XE (Fastchip, FAST)", "777", "2.4"
+ "Altirra (Fastchip)", "769", "2.43"
+ "Integer", "719", "2.6"
+ "Integer (FAST)", "575", "3.25"
+
+Turbo BASIC XL, Atari Microsoft BASIC, and OSS Integer BASIC run at
+the same speed with or without the Fastchip ROM, since they don't use
+the OS floating point routines.
+
+For reference, I rewrote the program in C and compiled it with
+cc65. It runs in 349 jiffies, 5.35x as fast as BASIC, with or without
+the Fastchip ROM. Since cc65 only supports integer arithmetic, this
+probably represents the theoretical maximum speed the algorithm could
+run in on the Atari, without rewriting it in assembly. By comparison,
+Integer BASIC looks pretty good.
+
+If you get rid of lines 180 to 210 (don't print the results), Integer
+BASIC with FAST runs it in 245 jiffies, and the equivalent C program
+runs in 61 jiffies. This shows that CIO and the E: device are the
+"bottleneck" for this program (and that compiled C is still faster
+than anything interpreted).
+
+
+BUGS
+====
+
+Modulo Arithmetic
+-----------------
+
+The **\\** (modulus) operator returns incorrect results in the
+cartridge version of Integer BASIC. This program demonstrates the
+bug::
+
+ 10 For I=1 To 10
+ 20 ? I,I\3,I-(I/3)*3
+ 30 Next I
+
+When run with the disk version, the results are correct::
+
+ 1 1 1
+ 2 2 2
+ 3 0 0
+ 4 1 1
+ 5 2 2
+ 6 0 0
+ 7 1 1
+ 8 2 2
+ 9 0 0
+ 10 1 1
+
+The same program run with the cartridge version gives::
+
+ 1 254 1
+ 2 255 2
+ 3 0 0
+ 4 1 1
+ 5 2 2
+ 6 253 0
+ 7 254 1
+ 8 255 2
+ 9 0 0
+ 10 1 1
+
+This is obviously wrong.
+
+If you're writing a real program in Integer BASIC, I recommend
+avoiding the **\\** operator entirely. Write something like **X-X/Y\*Y**
+instead.
diff --git a/protbas.1 b/protbas.1
new file mode 100644
index 0000000..971cb8a
--- /dev/null
+++ b/protbas.1
@@ -0,0 +1,151 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "PROTBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+protbas \- LIST-protect Atari 8-bit BASIC programs
+.SH SYNOPSIS
+.sp
+protbas [\fB\-v\fP] [\fB\-nc | **\-nv\fP] [\fB\-s\fP] [\fB\-xr\fP | \fB\-xNN\fP] \fBinput\-file\fP \fBoutput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBprotbas\fP reads a tokenized Atari 8\-bit BASIC program and writes a
+LIST\-protected copy of the program. See the \fBDETAILS\fP section of the
+\fBunprotbas\fP(1) man page, to understand how the protection works.
+.sp
+\fBinput\-file\fP must be a tokenized (SAVEd) Atari BASIC program. Use
+\fI\-\fP to read from standard input, but \fBprotbas\fP will refuse to
+read from standard input if it\(aqs a terminal.
+.sp
+\fBoutput\-file\fP will be the protected tokenized BASIC program. If it
+already exists, it will be overwritten. Use \fI\-\fP to write to standard
+output, but \fBprotbas\fP will refuse to write to standard output if
+it\(aqs a terminal (since tokenized BASIC is binary data and may confuse
+the terminal).
+.sp
+The code protection works by adding a line 32767 to the program, with
+a bad next\-line pointer. This will fail if there\(aqs already a line
+32767.
+.SH OPTIONS
+.sp
+Options may appear in any order. The first non\-option argument is used
+for \fBinput\-file\fP; the second is \fBoutput\-file\fP\&. A third non\-option
+argument is an error.
+.SS Protection Options
+.INDENT 0.0
+.TP
+.B \fB\-nc\fP
+Do not code\-protect the program; only protect the variable names.
+.TP
+.B \fB\-nv\fP
+Do not protect the variable names; only code\-protect the program.
+.TP
+.B \fB\-s\fP
+Shrink variable name table to minimum size, one byte per variable
+name. Programs protected this way are very similar to ones
+protected with \fBPROTECT.BAS\fP\&.
+.TP
+.B \fB\-xr\fP, \fB\-x\fP \fINN\fP
+Character to use for variable name protection. \fINN\fP is the
+character code in hex, e.g. \fB\-x20\fP to use a space. Default is
+\fB9b\fP (the EOL character). \fB\-xr\fP means random codes.
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH EXIT STATUS
+.INDENT 0.0
+.TP
+.B 0
+\fBinput\-file\fP was unprotected, protection was successful.
+.TP
+.B 1
+I/O error, or \fBinput\-file\fP isn\(aqt a valid BASIC program.
+.TP
+.B 2
+\fBinput\-file\fP is already a protected BASIC program.
+.UNINDENT
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/protbas.c b/protbas.c
new file mode 100644
index 0000000..4697fac
--- /dev/null
+++ b/protbas.c
@@ -0,0 +1,196 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+
+int protect_vars = 1;
+int protect_code = 1;
+int shrinktable = 0;
+int varname_char = 0x9b;
+
+/* 32767 END */
+unsigned char badcode[] = {
+ 0xff, 0x7f, /* line number 32767 */
+ 0x00, /* *bad* next-line offset */
+ 0x06, /* next-statement offset */
+ 0x15, /* END token */
+ 0x16, /* end-of-line token */
+};
+
+void scramble_vars(void) {
+ int i;
+
+ if(!vntable_ok()) {
+ fprintf(stderr, "%s: Program already was variable-protected.\n", self);
+ exit(2);
+ }
+
+ if(shrinktable) {
+ if(verbose) fprintf(stderr, "Shrinking variable name table.\n");
+ adjust_vntable_size((vvstart - 1) - vnstart, (codestart - vvstart) / 8);
+ }
+
+ if(varname_char == -1) srand(time(NULL));
+
+ for(i = vnstart; i < vvstart - 1; i++)
+ if(varname_char == -1)
+ program[i] = (rand() >> 8) & 0xff;
+ else
+ program[i] = varname_char & 0xff;
+
+ if(verbose) {
+ i -= vnstart;
+ if(i) {
+ fprintf(stderr, "Replaced %d byte variable name table with ", i);
+ if(varname_char == -1)
+ fprintf(stderr, "random characters.\n");
+ else
+ fprintf(stderr, "character $%02x.\n", varname_char);
+ } else {
+ fprintf(stderr, "Can't protect variables because there are no variables.\n");
+ }
+ }
+}
+
+CALLBACK(bad_offset) {
+ fprintf(stderr, "%s: program already was code-protected.\n", self);
+ exit(2);
+}
+
+unsigned short last_pos = 0;
+int last_lineno = -1;
+
+CALLBACK(save_linepos) {
+ last_pos = pos;
+ if(lineno == 32768) return;
+ last_lineno = lineno;
+}
+
+/* iterate over all the lines, insert a poisoned line 32767 just
+ before line 32768 */
+void breakcode(void) {
+ int offset;
+
+ on_start_line = save_linepos;
+ on_bad_line_length = bad_offset;
+ walk_all_code();
+
+ if(last_lineno == -1) die("Can't protect code because there are no lines of code.");
+ if(last_lineno == 32767) die("Can't protect code because there is already a line 32767.");
+
+ /* last_pos is now the start of line 32768, move it up to make room for
+ the new line */
+ offset = sizeof(badcode);
+ memmove(program + last_pos + offset, program + last_pos, filelen);
+
+ /* insert new line */
+ memmove(program + last_pos, badcode, offset);
+
+ if(verbose)
+ fprintf(stderr, "Inserted line 32767 with invalid offset at file offset $%04x.\n", last_pos);
+
+ /* update pointers that would be affected by the code move */
+ stmcur += offset;
+ starp += offset;
+ filelen += offset;
+ update_header();
+ parse_header();
+}
+
+void print_help(void) {
+ printf("Usage: %s [-v] [-nc|-nv] [-s] [-x[r|NN]] <inputfile> <outputfile>\n", self);
+ printf(" -v: Verbose.\n");
+ printf(" -nc: Don't protect code.\n");
+ printf(" -nv: Don't protect variable names.\n");
+ printf(" -s: Shrink variable name table to min size.\n");
+ printf("-xNN: Hex code NN for variable names.\n");
+ printf(" -xr: Random variable names.\n");
+ printf("Use - as a filename to read from stdin and/or write to stdout.\n");
+}
+
+void parse_args(int argc, char **argv) {
+ int opt, xopt_used = 0;
+
+ while( (opt = getopt(argc, argv, "vn:x:s")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 's': shrinktable = 1; break;
+ case 'n':
+ switch(optarg[0]) {
+ case 'c': protect_code = 0; break;
+ case 'v': protect_vars = 0; break;
+ default:
+ die("Invalid argument for -n (must be 'c' or 'v').");
+ }
+ break;
+ case 'x':
+ xopt_used = 1;
+ switch(optarg[0]) {
+ case 'r':
+ varname_char = -1; break;
+ case 0:
+ die("-x option requires a hex number or 'r'."); break;
+ default:
+ {
+ char *e;
+ varname_char = (int)strtol(optarg, &e, 16);
+ if(*e != 0 || varname_char > 0xff)
+ fprintf(stderr, "%s: Invalid hex value '%s' for -x option (range is 0 to ff).\n", self, optarg);
+ }
+ }
+ break;
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(!protect_code && !protect_vars) {
+ die("Nothing to do: -nc and -nv both given.");
+ }
+
+ if(!protect_vars) {
+ if(xopt_used)
+ die("-x option not valid with -nv.");
+ if(shrinktable)
+ die("-s option not valid with -nv.");
+ }
+
+ if(optind >= argc)
+ die("No input file given (use - for stdin).");
+ else
+ open_input(argv[optind]);
+
+ if(++optind >= argc)
+ die("No output file given (use - for stdout).");
+ else
+ output_filename = argv[optind];
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+ readfile();
+ parse_header();
+
+ if(verbose) {
+ fprintf(stderr, "Protecting program, ");
+ if(protect_vars && !protect_code)
+ fprintf(stderr, "variables only.\n");
+ else if(protect_code && !protect_vars)
+ fprintf(stderr, "code only.\n");
+ else
+ fprintf(stderr, "both code and variables.\n");
+ }
+ if(protect_vars) scramble_vars();
+ if(protect_code) breakcode();
+
+ open_output(output_filename);
+ writefile();
+ return 0; /* TODO: meaningful return status */
+}
diff --git a/protbas.rst b/protbas.rst
new file mode 100644
index 0000000..56fb7c1
--- /dev/null
+++ b/protbas.rst
@@ -0,0 +1,76 @@
+=======
+protbas
+=======
+
+---------------------------------------
+LIST-protect Atari 8-bit BASIC programs
+---------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+protbas [**-v**] [**-nc | **-nv**] [**-s**] [**-xr** | **-xNN**] **input-file** **output-file**
+
+DESCRIPTION
+===========
+
+**protbas** reads a tokenized Atari 8-bit BASIC program and writes a
+LIST-protected copy of the program. See the **DETAILS** section of the
+**unprotbas**\(1) man page, to understand how the protection works.
+
+**input-file** must be a tokenized (SAVEd) Atari BASIC program. Use
+*-* to read from standard input, but **protbas** will refuse to
+read from standard input if it's a terminal.
+
+**output-file** will be the protected tokenized BASIC program. If it
+already exists, it will be overwritten. Use *-* to write to standard
+output, but **protbas** will refuse to write to standard output if
+it's a terminal (since tokenized BASIC is binary data and may confuse
+the terminal).
+
+The code protection works by adding a line 32767 to the program, with
+a bad next-line pointer. This will fail if there's already a line
+32767.
+
+OPTIONS
+=======
+
+Options may appear in any order. The first non-option argument is used
+for **input-file**; the second is **output-file**. A third non-option
+argument is an error.
+
+Protection Options
+------------------
+**-nc**
+ Do not code-protect the program; only protect the variable names.
+
+**-nv**
+ Do not protect the variable names; only code-protect the program.
+
+**-s**
+ Shrink variable name table to minimum size, one byte per variable
+ name. Programs protected this way are very similar to ones
+ protected with **PROTECT.BAS**.
+
+**-xr**, **-x** *NN*
+ Character to use for variable name protection. *NN* is the
+ character code in hex, e.g. **-x20** to use a space. Default is
+ **9b** (the EOL character). **-xr** means random codes.
+
+.. include:: genopts.rst
+
+EXIT STATUS
+===========
+
+0
+ **input-file** was unprotected, protection was successful.
+
+1
+ I/O error, or **input-file** isn't a valid BASIC program.
+
+2
+ **input-file** is already a protected BASIC program.
+
+.. include:: manftr.rst
diff --git a/renumbas.1 b/renumbas.1
new file mode 100644
index 0000000..1d52523
--- /dev/null
+++ b/renumbas.1
@@ -0,0 +1,216 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "RENUMBAS" 1 "2025-03-27" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+renumbas \- Renumber Atari 8-bit BASIC programs
+.SH SYNOPSIS
+.sp
+renumbas [\fB\-v\fP] [\fB\-s\fP \fIstart\-lineno\fP] [\fB\-i\fP \fIincrement\fP] [\fB\-f\fP \fIfirst\-lineno\fP] [\fB\-b\fP] \fIinput\-file\fP \fIoutput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBrenumbas\fP reads a tokenized Atari 8\-bit BASIC program and writes a
+renumbered copy of the program.
+.sp
+\fBinput\-file\fP must be a tokenized (SAVEd) Atari BASIC, BASIC XL,
+BASIC XE, or Turbo BASIC program. Use \fI\-\fP to read from standard input,
+but \fBrenumbas\fP will refuse to read from standard input if it\(aqs a
+terminal.
+.sp
+\fBoutput\-file\fP will be the renumbered BASIC program. If it already
+exists, it will be overwritten. Use \fI\-\fP to write to standard output,
+but \fBrenumbas\fP will refuse to write to standard output if it\(aqs a
+terminal (since tokenized BASIC is binary data and may confuse the
+terminal).
+.sp
+Line number references are changed in every line where they occur,
+so e.g. if line 100 gets changed to 200, any other line that does a
+\fIGOTO\fP \fI100\fP (or \fIGOSUB\fP, \fIRESTORE\fP, \fITRAP\fP, etc) will be updated with
+the new line number. If the input is BASIC/A+ or OSS Integer BASIC,
+the line numbers will be changed, but references to them \fIwill not\fP
+be updated (a warning will be printed to stderr, in that case).
+.sp
+Computed line numbers can\(aqt be updated (e.g. \fIGOTO A or GOSUB
+1000+A*100\fP). These will cause warnings on stderr, so you can fix them
+manually.
+.sp
+Valid line numbers (0 to 32767) that don\(aqt exist will not be changed,
+but will cause a warning. Invalid line numbers (e.g. \fITRAP 40000\fP)
+will be ignored (no change, no warning).
+.sp
+Remember that the maximum line number for Atari BASIC is 32767.
+Renumbering will fail, if the chosen start and increment values
+would result in lines with numbers higher than this.
+.sp
+Atari BASIC allows fractional line numbers, such as \fIGOTO 123.4\fP\&.
+These are rounded to the nearest integer when the program is
+executed. \fBrenumbas\fP handles these correctly, although you\(aqre
+not likely to run into them in real\-world programs.
+.SH OPTIONS
+.sp
+Options may appear in any order. The first non\-option argument is used
+for \fBinput\-file\fP; the second is \fBoutput\-file\fP\&. A third non\-option
+argument is an error.
+.SS Renumber Options
+.INDENT 0.0
+.TP
+.B \fB\-s\fP \fIstart\-lineno\fP
+First line number in the renumbered program. Default: 10.
+.TP
+.B \fB\-i\fP \fIincrement\fP
+Line number increment between successive lines. Default: 10.
+.TP
+.B \fB\-f\fP \fIfirst\-lineno\fP
+Line number in original program where renumbering will start. Lines
+numbered lower that this will not be renumbered. Default: 0.
+.TP
+.B \fB\-b\fP
+Renumber program backwards (line numbers in descending
+order). This option is completely useless, but exists for testing
+purposes. Programs renumbered this way won\(aqt \fIRUN\fP correctly,
+although they will \fILOAD\fP and \fILIST\fP\&. When using this option, set
+\fB\-s\fP to a higher number than the default.
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH DIAGNOSTICS
+.INDENT 0.0
+.TP
+.B Fatal: Program is code\-protected; unprotect it first.
+Use \fBunprotbas\fP to remove the protection, if you get this error.
+.TP
+.B Fatal: New line number \fInum\fP would be >32767.
+32767 is the highest line number BASIC allows.
+Use a lower starting line (\fB\-s\fP) and/or increment (\fB\-i\fP).
+.TP
+.B Warning: Computed \fIcmd\fP at line \fInum\fP\&.
+The line number for a \fIGOTO\fP, \fIGOSUB\fP, etc is normally adjusted to
+whatever the line got renumbered to. This warning means that \fBrenumbas\fP
+couldn\(aqt adjust the line number, because it\(aqs a computed value such as
+\fIGOTO A+100\fP\&. You\(aqll have to fix this manually. \fInum\fP is the original
+line number, not the renumbered one.
+.TP
+.B Warning: Line \fInum1\fP references nonexistent line \fInum2\fP\&.
+Usually indicates a bug in the BASIC program. Example: \fIGOTO 100\fP,
+but there is no line 100. \fInum1\fP is the original line number, not the
+renumbered one.
+.TP
+.B Renumbering line \fInum1\fP as \fInum2\fP (\fInum3\fP refs).
+Only seen when the \fB\-v\fP (verbose) option is used. Just an informational
+message.
+.UNINDENT
+.SS Warning line numbers
+.sp
+Any warning that includes a line number (such as "Computed line number") will
+have the original line number, \fInot\fP the renumbered one. This is because
+the warnings are generated while scanning the program to find line number
+references, which happens before the actual renumbering (so the new number
+isn\(aqt known yet).
+.SH LIMITATIONS
+.sp
+A pathological case:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+100 GOTO 200+0
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+200+0 is considered a computed line number, even though the results of
+the computation are constant. This is because neither Atari BASIC nor
+\fBrenumbas\fP does constant folding.
+.sp
+This shouldn\(aqt be a real\-world problem; did \fIyou\fP ever write code like
+that in Atari BASIC?
+.SH EXIT STATUS
+.sp
+0 for success, 1 for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/renumbas.c b/renumbas.c
new file mode 100644
index 0000000..963f7c1
--- /dev/null
+++ b/renumbas.c
@@ -0,0 +1,150 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+#include "bcdfp.h"
+#include "linetab.h"
+
+unsigned short startlineno = 10;
+unsigned short increment = 10;
+unsigned short limit = 0;
+unsigned short newno;
+int backwards = 0;
+
+void print_help(void) {
+ printf("Usage: %s [-v] [-s start-lineno] [-i increment] [-f first-lineno] <inputfile> <outputfile>\n", self);
+ printf(" -v: Verbose.\n");
+ printf(" -s <num>: Starting line number (default: 10).\n");
+ printf(" -i <num>: Increment (default: 10).\n");
+ printf(" -f <num>: Don't renumber lines less than <num> (default: 0).\n");
+ printf(" -b: Number backwards (creates invalid program).\n");
+}
+
+unsigned short getlineno(char opt, const char *arg) {
+ int lineno;
+ char *e;
+
+ lineno = (int)strtol(arg, &e, 10);
+
+ if(*e) {
+ fprintf(stderr, "%s: Invalid line number for -%c option: %s is not a number.\n",
+ self, opt, arg);
+ exit(1);
+ }
+
+ if(lineno < 0 || lineno > 32767) {
+ fprintf(stderr, "%s: Invalid line number for -%c option: %d > 32767.\n",
+ self, opt, lineno);
+ exit(1);
+ }
+
+ return ((unsigned short)lineno);
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "vbs:i:f:")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 'b': backwards = 1; break;
+ case 's': startlineno = getlineno(opt, optarg); break;
+ case 'i': increment = getlineno(opt, optarg); break;
+ case 'f': limit = getlineno(opt, optarg); break;
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(optind >= argc)
+ die("No input file given (use - for stdin).");
+ else
+ open_input(argv[optind]);
+
+ if(++optind >= argc)
+ die("No output file given (use - for stdout).");
+ else
+ output_filename = argv[optind];
+}
+
+CALLBACK(renumber_line) {
+ int i;
+ unsigned char fpnewno[6];
+
+ if(lineno < limit || lineno == 32768) return;
+ if(newno >= 32768) {
+ fprintf(stderr, "%s: Fatal: New line number %d would be >32767.\n", self, newno);
+ exit(1);
+ }
+
+ if(verbose)
+ fprintf(stderr, "Renumbering line %d as %d (%d refs).\n", lineno, newno, refcounts[lineno]);
+
+ int2fp(newno, fpnewno);
+ for(i = 0; i < refcounts[lineno]; i++)
+ memmove(program + linerefs[lineno][i].pos, fpnewno, 6);
+ setword(pos, newno);
+
+ if(backwards) {
+ if(newno < increment) {
+ fprintf(stderr, "%s: Fatal: New line number %d would be <0.\n", self, newno);
+ exit(1);
+ } else {
+ newno -= increment;
+ }
+ } else {
+ newno += increment;
+ }
+}
+
+void check_refs(void) {
+ int i, j;
+
+ for(i = 0; i < 32768; i++) {
+ if(refcounts[i] && !lines_exist[i]) {
+ for(j = 0; j < refcounts[i]; j++) {
+ fprintf(stderr, "%s: Warning: Line %d references nonexistent line %d.\n",
+ self, linerefs[i][j].lineno, i);
+ }
+ }
+ }
+}
+
+void renumber(void) {
+ check_refs();
+ newno = startlineno;
+ on_start_line = renumber_line;
+ walk_all_code();
+}
+
+void check_basic_type(void) {
+ if(lomem == 0x77) {
+ fprintf(stderr, "%s: Warning: OSS Integer BASIC not fully supported.\n", self);
+ } else if(save_command_tok == 0x1d || save_command_tok == 0x48) {
+ fprintf(stderr, "%s: Warning: BASIC/A+ not fully supported.\n", self);
+ }
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+ check_basic_type();
+
+ build_ref_table();
+ renumber();
+ free_ref_table();
+
+ open_output(output_filename);
+ writefile();
+
+ return 0;
+}
diff --git a/renumbas.rst b/renumbas.rst
new file mode 100644
index 0000000..bcfa996
--- /dev/null
+++ b/renumbas.rst
@@ -0,0 +1,138 @@
+========
+renumbas
+========
+
+-----------------------------------
+Renumber Atari 8-bit BASIC programs
+-----------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+renumbas [**-v**] [**-s** *start-lineno*] [**-i** *increment*] [**-f** *first-lineno*] [**-b**] *input-file* *output-file*
+
+DESCRIPTION
+===========
+
+**renumbas** reads a tokenized Atari 8-bit BASIC program and writes a
+renumbered copy of the program.
+
+**input-file** must be a tokenized (SAVEd) Atari BASIC, BASIC XL,
+BASIC XE, or Turbo BASIC program. Use *-* to read from standard input,
+but **renumbas** will refuse to read from standard input if it's a
+terminal.
+
+**output-file** will be the renumbered BASIC program. If it already
+exists, it will be overwritten. Use *-* to write to standard output,
+but **renumbas** will refuse to write to standard output if it's a
+terminal (since tokenized BASIC is binary data and may confuse the
+terminal).
+
+Line number references are changed in every line where they occur,
+so e.g. if line 100 gets changed to 200, any other line that does a
+*GOTO* *100* (or *GOSUB*, *RESTORE*, *TRAP*, etc) will be updated with
+the new line number. If the input is BASIC/A+ or OSS Integer BASIC,
+the line numbers will be changed, but references to them *will not*
+be updated (a warning will be printed to stderr, in that case).
+
+
+Computed line numbers can't be updated (e.g. *GOTO A or GOSUB
+1000+A*100*). These will cause warnings on stderr, so you can fix them
+manually.
+
+Valid line numbers (0 to 32767) that don't exist will not be changed,
+but will cause a warning. Invalid line numbers (e.g. *TRAP 40000*)
+will be ignored (no change, no warning).
+
+Remember that the maximum line number for Atari BASIC is 32767.
+Renumbering will fail, if the chosen start and increment values
+would result in lines with numbers higher than this.
+
+Atari BASIC allows fractional line numbers, such as *GOTO 123.4*.
+These are rounded to the nearest integer when the program is
+executed. **renumbas** handles these correctly, although you're
+not likely to run into them in real-world programs.
+
+OPTIONS
+=======
+
+Options may appear in any order. The first non-option argument is used
+for **input-file**; the second is **output-file**. A third non-option
+argument is an error.
+
+Renumber Options
+----------------
+**-s** *start-lineno*
+ First line number in the renumbered program. Default: 10.
+
+**-i** *increment*
+ Line number increment between successive lines. Default: 10.
+
+**-f** *first-lineno*
+ Line number in original program where renumbering will start. Lines
+ numbered lower that this will not be renumbered. Default: 0.
+
+**-b**
+ Renumber program backwards (line numbers in descending
+ order). This option is completely useless, but exists for testing
+ purposes. Programs renumbered this way won't *RUN* correctly,
+ although they will *LOAD* and *LIST*. When using this option, set
+ **-s** to a higher number than the default.
+
+.. include:: genopts.rst
+
+DIAGNOSTICS
+===========
+
+Fatal: Program is code-protected; unprotect it first.
+ Use **unprotbas** to remove the protection, if you get this error.
+
+Fatal: New line number *num* would be >32767.
+ 32767 is the highest line number BASIC allows.
+ Use a lower starting line (**-s**) and/or increment (**-i**).
+
+Warning: Computed *cmd* at line *num*.
+ The line number for a *GOTO*, *GOSUB*, etc is normally adjusted to
+ whatever the line got renumbered to. This warning means that **renumbas**
+ couldn't adjust the line number, because it's a computed value such as
+ *GOTO A+100*. You'll have to fix this manually. *num* is the original
+ line number, not the renumbered one.
+
+Warning: Line *num1* references nonexistent line *num2*.
+ Usually indicates a bug in the BASIC program. Example: *GOTO 100*,
+ but there is no line 100. *num1* is the original line number, not the
+ renumbered one.
+
+Renumbering line *num1* as *num2* (*num3* refs).
+ Only seen when the **-v** (verbose) option is used. Just an informational
+ message.
+
+Warning line numbers
+--------------------
+Any warning that includes a line number (such as "Computed line number") will
+have the original line number, *not* the renumbered one. This is because
+the warnings are generated while scanning the program to find line number
+references, which happens before the actual renumbering (so the new number
+isn't known yet).
+
+LIMITATIONS
+===========
+
+A pathological case::
+
+ 100 GOTO 200+0
+
+200+0 is considered a computed line number, even though the results of
+the computation are constant. This is because neither Atari BASIC nor
+**renumbas** does constant folding.
+
+This shouldn't be a real-world problem; did *you* ever write code like
+that in Atari BASIC?
+
+EXIT STATUS
+===========
+
+0 for success, 1 for failure.
+
+.. include:: manftr.rst
diff --git a/rom2cart.1 b/rom2cart.1
index a3dfcb9..d8a8927 100644
--- a/rom2cart.1
+++ b/rom2cart.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "ROM2CART" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "ROM2CART" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
rom2cart \- Convert a raw ROM image to an Atari800 CART image, or vice versa
.\" RST source for rom2cart(1) man page. Convert with:
@@ -239,25 +239,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/tokens.c b/tokens.c
new file mode 100644
index 0000000..675d220
--- /dev/null
+++ b/tokens.c
@@ -0,0 +1,135 @@
+const char *commands[] = {
+ "REM", /* $00 */
+ "DATA",
+ "INPUT",
+ "COLOR",
+ "LIST", /* $04 */
+ "ENTER",
+ "LET",
+ "IF",
+ "FOR", /* $08 */
+ "NEXT",
+ "GOTO",
+ "GO TO",
+ "GOSUB", /* $0C */
+ "TRAP",
+ "BYE",
+ "CONT",
+ "COM", /* $10 */
+ "CLOSE",
+ "CLR",
+ "DEG",
+ "DIM", /* $14 */
+ "END",
+ "NEW",
+ "OPEN",
+ "LOAD", /* $18 */
+ "SAVE",
+ "STATUS",
+ "NOTE",
+ "POINT", /* $1C */
+ "XIO",
+ "ON",
+ "POKE",
+ "PRINT", /* $20 */
+ "RAD",
+ "READ",
+ "RESTORE",
+ "RETURN", /* $24 */
+ "RUN",
+ "STOP",
+ "POP",
+ "?", /* $28 */
+ "GET",
+ "PUT",
+ "GRAPHICS",
+ "PLOT", /* $2C */
+ "POSITION",
+ "DOS",
+ "DRAWTO",
+ "SETCOLOR", /* $30 */
+ "LOCATE",
+ "SOUND",
+ "LPRINT",
+ "CSAVE", /* $34 */
+ "CLOAD",
+ "", /* $36, implied LET */
+ "ERROR- " /* $37 */
+};
+
+const unsigned short last_command = (sizeof(commands) / sizeof(char *)) - 1;
+
+const char *operators[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,
+ ",", /* $12 */
+ "$",
+ ":", /* $14, named OP_COLON and OP_EOS in bas.h */
+ ";",
+ "", /* $16, EOL */
+ " GOTO ",
+ " GOSUB ", /* $18 */
+ " TO ",
+ " STEP ",
+ " THEN ",
+ "#", /* $1C */
+ "<=",
+ "<>",
+ ">=",
+ "<", /* $20 */
+ ">",
+ "=",
+ "^",
+ "*", /* $24 */
+ "+",
+ "-",
+ "/",
+ " NOT ", /* $28 */
+ " OR ",
+ " AND ",
+ "(",
+ ")",
+ "=",
+ "=",
+ "<=",
+ "<>", /* $30 */
+ ">=",
+ "<",
+ ">",
+ "=", /* $34 */
+ "+",
+ "-",
+ "(",
+ "", /* $38, redundant "(" for arrays */
+ "", /* $39, ditto for strings */
+ "(",
+ "(",
+ ",", /* $3C */
+ "STR$",
+ "CHR$",
+ "USR",
+ "ASC", /* $40 */
+ "VAL",
+ "LEN",
+ "ADR",
+ "ATN", /* $44 */
+ "COS",
+ "PEEK",
+ "SIN",
+ "RND", /* $48 */
+ "FRE",
+ "EXP",
+ "LOG",
+ "CLOG", /* $4C */
+ "SQR",
+ "SGN",
+ "ABS",
+ "INT", /* $50 */
+ "PADDLE",
+ "STICK",
+ "PTRIG",
+ "STRIG" /* $54 */
+};
+
+const unsigned short last_operator = (sizeof(operators) / sizeof(char *)) - 1;
diff --git a/tokens.h b/tokens.h
new file mode 100644
index 0000000..265122e
--- /dev/null
+++ b/tokens.h
@@ -0,0 +1,4 @@
+extern const char *commands[];
+extern const char *operators[];
+extern const unsigned short last_command;
+extern const unsigned short last_operator;
diff --git a/turbo_tokens.c b/turbo_tokens.c
new file mode 100644
index 0000000..2278e21
--- /dev/null
+++ b/turbo_tokens.c
@@ -0,0 +1,82 @@
+/* these start at token 0x38 */
+const char *turbo_cmds[] = {
+ "DPOKE", /* $38 */
+ "MOVE",
+ "-MOVE",
+ "*F",
+ "REPEAT",
+ "UNTIL",
+ "WHILE",
+ "WEND",
+ "ELSE", /* $40 */
+ "ENDIF",
+ "BPUT",
+ "BGET",
+ "FILLTO",
+ "DO",
+ "LOOP",
+ "EXIT",
+ "DIR", /* $48 */
+ "LOCK",
+ "UNLOCK",
+ "RENAME",
+ "DELETE",
+ "PAUSE",
+ "TIME$=",
+ "PROC",
+ "EXEC", /* $50 */
+ "ENDPROC",
+ "FCOLOR",
+ "*L",
+ "------------------------------",
+ "RENUM",
+ "DEL",
+ "DUMP",
+ "TRACE", /* $58 */
+ "TEXT",
+ "BLOAD",
+ "BRUN",
+ "GO#",
+ "#",
+ "*B",
+ "PAINT",
+ "CLS", /* $58 */
+ "DSOUND",
+ "CIRCLE",
+ "%PUT",
+ "%GET" /* $64 */
+};
+
+const int turbo_cmd_size = sizeof(turbo_cmds);
+
+/* these start at token 0x55 */
+const char *turbo_ops[] = {
+ "DPEEK", /* $55 */
+ "&",
+ "!",
+ "INSTR", /* $58 */
+ "INKEY$",
+ " EXOR ",
+ "HEX$",
+ "DEC",
+ " DIV ",
+ "FRAC",
+ "TIME$",
+ "TIME", /* $60 */
+ " MOD ",
+ " EXEC ",
+ "RND",
+ "RAND",
+ "TRUNC",
+ "%0",
+ "%1",
+ "%2", /* $68 */
+ "%3",
+ " GO# ",
+ "UINSTR",
+ "ERR",
+ "ERL", /* $6D */
+};
+
+const int turbo_ops_size = sizeof(turbo_ops);
+
diff --git a/turbo_tokens.h b/turbo_tokens.h
new file mode 100644
index 0000000..3cb83ec
--- /dev/null
+++ b/turbo_tokens.h
@@ -0,0 +1,5 @@
+extern const char *turbo_cmds[];
+extern const int turbo_cmd_size;
+
+extern const char *turbo_ops[];
+extern const int turbo_ops_size;
diff --git a/unmac65.1 b/unmac65.1
index 8e17857..d1bcfbe 100644
--- a/unmac65.1
+++ b/unmac65.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "UNMAC65" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "UNMAC65" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
unmac65 \- Detokenize Atari 8-bit Mac/65 SAVEd files.
.\" RST source for unmac65(1) man page. Convert with:
@@ -371,25 +371,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/unmac65.c b/unmac65.c
index 42875bb..69d4703 100644
--- a/unmac65.c
+++ b/unmac65.c
@@ -822,6 +822,7 @@ void atari8_get_opts() {
#endif
void usage() {
+ fputs(BANNER, stderr);
fprintf(stderr, "usage: " SELF " [options] inputfile\n\n");
fprintf(stderr, "options:\n");
#ifndef ATARI8
@@ -998,9 +999,8 @@ void handle_cli_opts(int argc, char **argv) {
}
int main(int argc, char **argv) {
- fputs(BANNER, stderr);
-
#ifdef ATARI8
+ fputs(BANNER, stderr);
while(1) {
if(argc < 2) {
atari8_get_opts();
diff --git a/unmac65.xex b/unmac65.xex
new file mode 100644
index 0000000..987667b
--- /dev/null
+++ b/unmac65.xex
Binary files differ
diff --git a/unprotbas.1 b/unprotbas.1
index 2b389ac..7521520 100644
--- a/unprotbas.1
+++ b/unprotbas.1
@@ -27,20 +27,21 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "UNPROTBAS" 1 "2024-05-19" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "UNPROTBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
unprotbas \- Unprotect LIST-protected Atari 8-bit BASIC programs
.SH SYNOPSIS
.sp
-unprotbas [\fB\-v\fP] [\fB\-f\fP] [\fB\-n\fP] [\fB\-g\fP] [\fB\-c\fP] \fBinput\-file\fP \fBoutput\-file\fP
+unprotbas [\fB\-v\fP] [\fB\-f\fP] [\fB\-n\fP] [\fB\-g\fP] [\fB\-c\fP] [\fB\-r\fP | \fB\-w\fP] \fBinput\-file\fP \fBoutput\-file\fP
.SH DESCRIPTION
.sp
-\fBunprotbas\fP modifies a LIST\-protected Atari 8\-bit BASIC program,
-creating a new non\-protected copy. See \fBDETAILS\fP, below, to
-understand how the protection and unprotection works.
+\fBunprotbas\fP modifies a tokenized LIST\-protected Atari 8\-bit BASIC
+program, creating a new non\-protected copy. See \fBDETAILS\fP, below,
+to understand how the protection and unprotection works.
.sp
\fBinput\-file\fP must be a tokenized (SAVEd) Atari BASIC program. Use
-\fI\-\fP to read from standard input.
+\fI\-\fP to read from standard input, but \fBunprotbas\fP will refuse to
+read from standard input if it\(aqs a terminal.
.sp
\fBoutput\-file\fP will be the unprotected tokenized BASIC program. If it
already exists, it will be overwritten. Use \fI\-\fP to write to standard
@@ -49,14 +50,16 @@ it\(aqs a terminal (since tokenized BASIC is binary data and may confuse
the terminal).
.SH OPTIONS
.sp
+Options may appear in any order. The first non\-option argument is used
+for \fBinput\-file\fP; the second is \fBoutput\-file\fP\&. A third non\-option
+argument is an error.
+.sp
Option bundling is not supported, use e.g. \fB\-v \-f\fP, not \fB\-vf\fP\&.
To use filenames beginning with \fI\-\fP, write them as \fI\&./\-file\fP, or they
will be treated as options.
+.SS Unprotection Options
.INDENT 0.0
.TP
-.B \fB\-v\fP
-Verbose operation.
-.TP
.B \fB\-f\fP
Force the variable name table to be rebuilt, even if it looks OK.
This option cannot be combined with \fB\-n\fP\&.
@@ -73,6 +76,31 @@ it\(aqs left as\-is, in case it\(aqs actually data used by the program.
Check only. Does a dry run. Loads the program, unprotects it in
memory, but doesn\(aqt write the result anywhere. In this mode, there
is no \fBoutput\-file\fP\&.
+.TP
+.B \fB\-w\fP
+Write the variable names to \fBvarnames.txt\fP, one per line.
+This can be edited, and later used with \fB\-r\fP to set the variable names
+to something sensible rather than A, B, C, etc. For an unprotected
+program, you can use \fB\-n\fP to write the existing names rather than
+generating new ones. See \fBVARIABLE NAMES\fP, below. If \fBvarnames.txt\fP
+already exists, it will be overwritten.
+.TP
+.B \fB\-r\fP
+Read variable names from \fBvarnames.txt\fP, and use them instead of
+generating the names. See \fBVARIABLE NAMES\fP, below.
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
.UNINDENT
.SH EXIT STATUS
.INDENT 0.0
@@ -140,7 +168,7 @@ a new one that\(aqs valid. However, since there are no real variable
names in the program, the recovery process just invents new ones,
named A through Z, A1 through A9, B1 through B9, etc, etc. It\(aqll
require human intelligence to figure out what each variable is for,
-since the names are meaningless.
+since the names are meaningless. See \fBVARIABLE NAMES\fP, below.
.sp
The \fBoutput\-file\fP may not be the exact size that the
\fBinput\-file\fP was. Some types of variable\-name scrambling shrink
@@ -149,12 +177,18 @@ the rebuilt table will be larger. Other types of scrambling leave
the variable name table at its original size, but \fBunprotbas\fP
generates only one\- and two\-character variable names, so the rebuilt
table might be smaller.
+.sp
+The program \fBPROTECT.BAS\fP, found on Disk 2 of the Holmes Archive,
+creates protected BASIC programs that only use variable name
+scrambling.
+.sp
+\fBprotbas\fP(1) also does variable name scrambling.
.TP
.B Bad next\-line pointer
Every line of tokenized BASIC contains a line length byte, which
-BASIC uses as a pointer to the next line of code. Before printing
-the READY prompt, BASIC iterates over every line of code in the
-program, using the next\-line pointers, in order to delete any
+BASIC uses as a pointer to the next line of code. Before executing
+an immediate mode command, BASIC iterates over every line of code in
+the program, using the next\-line pointers, in order to delete any
existing line 32768 (the previous immediate mode command). If any
line\(aqs pointer is set to zero, that means it points to itself.
.sp
@@ -164,35 +198,136 @@ prevents LIST, it actually prevents any immediate mode command:
after LOADing such a file, \fInothing\fP will work (even pressing RESET
won\(aqt get you out of it). The only way to use such a program is to
use the RUN command with a filename, and if the program ever exits
-(due to END, STOP, an error, or the Break key), BASIC will get stuck
-again.
+(due to END, STOP, an error, Break key, or even System Reset), BASIC
+will get stuck again.
.sp
-This doesn\(aqt \fIhave\fP to be done with the last line in the
-program. The "poisoned" line could be followed by more lines of
-code, though they could never actually execute.
+This doesn\(aqt \fIhave\fP to be done with the last line in the program,
+though it normally is. The "poisoned" line can never be executed (or
+BASIC will lock up), but it could be followed by more lines of code
+(which also could never be executed).
.sp
Line 32100 in the example above does this job, taking advantage of
the STMCUR pointer used by BASIC, which holds the address of the
line of tokenized code currently being executed.
.sp
-\fBunprotbas\fP fixes this simply by calculating what the pointer
-should be (based on the tokens in the line) and changing it. No
-information is lost by doing this.
+Each statement in the line also has a statement\-length byte. For
+lines with only one statement, its value is the same as the line
+length. For lines with multiple statements (separated by \fI:\fP), it\(aqs
+a pointer to the next statement, counting from the start of the
+current line. For the last statement on a line, it\(aqs a pointer to
+the next line of code, meaning it\(aqs identical to the line length.
+.sp
+\fBunprotbas\fP fixes bad line lengths by setting the line length to
+the statement length of the last statement. No information is lost
+by doing this.
+.sp
+The program \fBUNPROTEC\fP, from the \fIPirate\(aqs Treasure Chest\fP, can
+fix bad pointers in protected programs, though it doesn\(aqt do
+anything about variable name scrambling.
+.sp
+\fBprotbas\fP also does this type of protection.
.UNINDENT
.sp
One more thing \fBunprotbas\fP can do is remove extra data from the end
of the file. It\(aqs possible for BASIC files to contain extra data that
-occurs after the end of the program. Some programs use this as a way
-to load arbitrary binary data into memory along with the program; for
-other programs, the extra data is truly garbage (e.g. an EOF character
-if the file came from a CP/M system, or padding to a block size if a
-dumb implementation of XMODEM was used to transfer the file).
+occurs after the end of the program. Such data might be:
+.INDENT 0.0
+.IP \(bu 2
+Pre\-defined strings and/or arrays, saved with the program by
+modifying the STARP pointer.
+.IP \(bu 2
+Arbitrary binary data used by the program at runtime, such as
+machine language routines, or fonts.
+.IP \(bu 2
+Zero bytes, caused by SAVEing the program with revision B BASIC. Every
+time a program is LOADed, edited (or not) and then SAVEd again, 16
+bytes of extra (garbage) data gets added to the program. To avoid
+this, don\(aqt use revision B (use rev C if possible, A otherwise).
+.IP \(bu 2
+Garbage added by some system previously used to store or transmit
+the file. CP/M systems might add an EOF (^Z) character. Dumb
+file transfer software might pad the file up to its block size.
+.UNINDENT
.sp
Normally, such "garbage" doesn\(aqt hurt anything. BASIC ignores it. Or
it normally does... if you suspect it\(aqs causing a problem, you can
remove it with the \fB\-g\fP option. If removing the "garbage" causes the
program to fail to run, it wasn\(aqt garbage! \fBunprotbas\fP doesn\(aqt
remove extra data by default, to be on the safe side.
+.SH VARIABLE NAMES
+.sp
+If variable name scrambling was used, the original variable names no
+longer exist. \fBunprotbas\fP will generate them, according to these rules:
+.INDENT 0.0
+.INDENT 3.5
+The first 26 numeric variables will be called \fIA\fP through \fIZ\fP\&. Further
+numeric variables will be \fIA1\fP through \fIA9\fP, \fIB1\fP through \fIB9\fP, etc.
+.sp
+The first 26 string variables will be \fIA$\fP to \fIZ$\fP, then \fIA1$\fP to
+\fIA9$\fP, \fIB1$\fP to \fIB9$\fP, etc.
+.sp
+The first 26 array variables will be \fIA(\fP to \fIZ(\fP, then \fIA1(\fP to
+\fIA9(\fP, \fIB1(\fP to \fIB9(\fP, etc.
+.UNINDENT
+.UNINDENT
+.sp
+Note that array variables have only the \fI(\fP as part of the name. The
+closing \fI)\fP is "cosmetic" and not part of the actual name.
+.sp
+To properly reverse\-engineer the protected program, it\(aqs necessary to assign
+meaningful variable names. \fBunprotbas\fP isn\(aqt smart enough to do this for you,
+but it can semi\-automate the process.
+.sp
+First, run \fBunprotbas\fP with the \fB\-w\fP option. This will create a
+file called \fBvarnames.txt\fP, containing the generated variable names.
+These are in order, one line per variable name, ending with \fI$\fP for strings
+and the \fI(\fP for arrays.
+.sp
+Load the unprotected program on the Atari and LIST it (or use \fBchkbas\fP to get a
+listing), and edit \fBvarnames.txt\fP in a text editor.
+.sp
+As you figure out what each variable\(aqs purpose is, change its name
+in the text file. When editing the file:
+.INDENT 0.0
+.IP \(bu 2
+Don\(aqt add or delete any lines.
+.IP \(bu 2
+Don\(aqt get rid of the \fI$\fP or \fI(\fP at the end of any line.
+.IP \(bu 2
+You may enter the names in lowercase (\fBunprotbas\fP will convert them to uppercase).
+.IP \(bu 2
+Remember to follow the rules for BASIC variable names:
+The first character must be a letter, other characters must be a letter
+or a number, and only the last character can be \fI$\fP or \fI(\fP\&.
+.IP \(bu 2
+No duplicates of the same type are allowed (you can have \fIFOO\fP and \fIFOO$\fP,
+but not two numerics called \fIFOO\fP).
+.UNINDENT
+.sp
+When you\(aqre finished, re\-run \fBunprotbas\fP, this time with the \fB\-r\fP
+option. If all is well, the unprotected program will use your variable
+names, rather than generating new ones. If you broke the rules, you
+should get an informative error message explaining what and where the
+problem is.
+.sp
+This process can also be used for regular unprotected programs. Use
+\fB\-n \-w\fP the first time, to save the existing variable names to
+\fBvarnames.txt\fP rather than generating new ones.
+.SH NOTES
+.sp
+Atari BASIC has a limit of 128 variables in a program. It\(aqs actually
+possible for the variable name table to contain up to 256 variables,
+though the 129th and further ones won\(aqt be usable in the program. The
+variable value table can hold more than 256 values, though the
+variable numbers wrap around once they pass 255. The attempt to add
+variables past the 128th causes BASIC to respond with \fIERROR\- 4\fP, but
+the variable does get added to the tables. \fBunprotbas\fP will preserve
+these extra (useless) entries in the tables.
+.sp
+If there more than 256 entries in the value table, you will see
+"Warning: skipping variable numbers >=256 in value table". This is
+a pathological case, and shouldn\(aqt happen with programs that aren\(aqt
+deliberately crafted to test this behaviour.
.SH COPYRIGHT
.sp
WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
@@ -203,25 +338,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/unprotbas.c b/unprotbas.c
index 0b11e0e..f7007fc 100644
--- a/unprotbas.c
+++ b/unprotbas.c
@@ -2,6 +2,10 @@
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
/* attempt to fix a "list-protected" Atari 8-bit BASIC program.
we don't fully detokenize, so this won't fix truly corrupted
@@ -14,29 +18,11 @@
or whatever), we "fix" that by making up new variable names.
*/
-#define STM_OFFSET 0xf2
-
-/* entire file gets read into memory (for now) */
-unsigned char data[65536];
-
-/* BASIC 14-byte header values */
-unsigned short lomem;
-unsigned short vntp;
-unsigned short vntd;
-unsigned short vvtp;
-unsigned short stmtab;
-unsigned short stmcur;
-unsigned short starp;
-
-/* positions where various parts of the file start,
- derived from the header vars above. */
-unsigned short codestart;
-unsigned short vnstart;
-unsigned short vvstart;
-int filelen;
-
-/* name of executable, taken from argv[0] */
-char *self;
+/* for the -r option */
+#define MAP_FILE "varnames.txt"
+unsigned char varnames[BUFSIZE];
+unsigned char *varmap[MAXVARS];
+int varmap_count;
/* these are set by the various command-line switches */
int keepvars = 0;
@@ -44,64 +30,8 @@ int forcevars = 0;
int keepgarbage = 1;
int checkonly = 0;
int was_protected = 0;
-int verbose = 0;
-
-/* file handles */
-FILE *input_file = NULL;
-FILE *output_file = NULL;
-
-void die(const char *msg) {
- fprintf(stderr, "%s: %s\n", self, msg);
- exit(1);
-}
-
-/* read entire file into memory */
-int readfile(void) {
- int got = fread(data, 1, 65535, input_file);
- if(verbose) fprintf(stderr, "read %d bytes\n", got);
- fclose(input_file);
- return got;
-}
-
-/* get a 16-bit value from the file, in 6502 LSB/MSB order. */
-unsigned short getword(int addr) {
- return data[addr] | (data[addr + 1] << 8);
-}
-
-void setword(int addr, int value) {
- data[addr] = value & 0xff;
- data[addr + 1] = value >> 8;
-}
-
-void dump_header_vars(void) {
- fprintf(stderr, "LOMEM $%04x VNTP $%04x VNTD $%04x VVTP $%04x\n", lomem, vntp, vntd, vvtp);
- fprintf(stderr, "STMTAB $%04x STMCUR $%04x STARP $%04x\n", stmtab, stmcur, starp);
- fprintf(stderr, "vnstart $%04x, vvstart $%04x, codestart $%04x\n", vnstart, vvstart, codestart);
-}
-
-void read_header(void) {
- lomem = getword(0);
- vntp = getword(2);
- vntd = getword(4);
- vvtp = getword(6);
- stmtab = getword(8);
- stmcur = getword(10);
- starp = getword(12);
- codestart = stmtab - STM_OFFSET - (vntp - 256);
- vnstart = vntp - 256 + 14;
- vvstart = vvtp - 256 + 14;
- if(verbose) dump_header_vars();
-}
-
-void set_header_vars(void) {
- setword(0, lomem);
- setword(2, vntp);
- setword(4, vntd);
- setword(6, vvtp);
- setword(8, stmtab);
- setword(10, stmcur);
- setword(12, starp);
-}
+int readmap = 0;
+int writemap = 0;
/* fixline() calculates & sets correct line length, by iterating
over the statement(s) within the line. the last statement's
@@ -122,30 +52,29 @@ void set_header_vars(void) {
2 09 line length (or, offset to next line) [!]
3 06 offset to next statement *from the start of the line*
4 28 token for "?"
- 5 14 token for : (end of statement)
+ 5 14 token for : (end of statement), we call it OP_COLON
6 09 offset to next statement [!]
7 15 token for END
8 16 token for end-of-line [*]
9 ?? (line number of next statement)
Note the values marked with [!] are equal.
+ The line length at offset 2 is what gets zeroed out by the
+ protection. To fix it, we follow the next-statement offsets. If
+ there's not a colon before the offset, replace the byte at
+ offset 2 with that statement's offset.
[*] end-of-line is $16 *except* for REM and DATA, which are
terminated with $9B instead.
*/
int fixline(int linepos) {
/* +3 here to skip the line number + line length */
- int token, done = 0, offset = data[linepos + 3];
-
- while(!done) {
- offset = data[linepos + offset];
- token = data[linepos + offset - 1];
- /* fprintf(stderr, "offset %02x token %02x\n", offset, token); */
- if(token != 0x14)
- done++;
- }
+ int offset = program[linepos + 3];
- data[linepos + 2] = offset;
+ while(program[linepos + offset - 1] == OP_COLON)
+ offset = program[linepos + offset];
+
+ program[linepos + 2] = offset;
return offset;
}
@@ -159,16 +88,16 @@ int fixcode(void) {
while(pos < filelen) {
tmpno = getword(pos);
if(tmpno <= lineno) {
- fprintf(stderr, "Warning: line number %d at offset %04x is <= previous line number %d\n",
+ fprintf(stderr, "Warning: line number %d at offset $%04x is <= previous line number %d.\n",
tmpno, pos, lineno);
}
lineno = tmpno;
- offset = data[pos + 2];
+ offset = program[pos + 2];
/* fprintf(stderr, "pos %d, line #%d, offset %d\n", pos, lineno, offset); */
if(offset < 6) {
- if(verbose) fprintf(stderr, "Found invalid offset %d (<6) at line %d\n", offset, lineno);
- offset += fixline(pos);
+ if(verbose) fprintf(stderr, "Found invalid offset %d (<6) at line %d, file offset $%04x.\n", offset, lineno, pos);
+ offset = fixline(pos);
result++;
}
pos += offset;
@@ -178,33 +107,29 @@ int fixcode(void) {
if(lineno == 32768) break;
}
- if(verbose) fprintf(stderr, "End program pos $%04x/%d\n", pos, pos);
+ if(verbose) fprintf(stderr, "End program file offset: $%04x/%d\n", pos, pos);
if(filelen > pos) {
- if(verbose) fprintf(stderr, "trailing garbage at EOF, %d bytes, %s\n",
- filelen - pos, (keepgarbage ? "keeping" : "removing"));
+ int i, same = 1;
+ for(i = pos; i < filelen; i++) {
+ if(program[i] != program[pos]) same = 0;
+ }
+ if(verbose) {
+ fprintf(stderr, "Trailing garbage at EOF, %d bytes, ", filelen - pos);
+ if(same)
+ fprintf(stderr, "all $%02x", program[pos]);
+ else
+ fprintf(stderr, "maybe valid data");
+ fprintf(stderr, ", %s.\n", (keepgarbage ? "keeping" : "removing"));
+ }
if(!keepgarbage) filelen = pos;
+ } else {
+ if(verbose)
+ fprintf(stderr, "No trailing garbage at EOF.\n");
}
-
return result;
}
-/* sometimes the variable name table isn't large enough to hold
- the generated variable names. move_code() makes more space,
- by moving the rest of the program (including the variable value
- table) up in memory. */
-void move_code(int offset) {
- memmove(data + vvstart + offset, data + vvstart, filelen);
- vntd += offset;
- vvtp += offset;
- stmtab += offset;
- stmcur += offset;
- starp += offset;
- set_header_vars();
- read_header();
- filelen += offset;
-}
-
/* Fixing the variables is a bit more work than it seems like
it might be, because the last byte of the name has to match
the type (inverse video "(" for numeric array, inverse "$" for
@@ -229,52 +154,6 @@ void move_code(int offset) {
or letter+number or one-letter string/array names).
*/
-int vntable_ok(void) {
- int vp, bad;
-
- if(vntp == vntd) {
- if(verbose) fprintf(stderr, "No variables\n");
- return 1;
- }
-
- /* first pass: bad = 1 if all the bytes in the table have the same
- value, no matter what it is. */
- vp = vnstart + 1;
- bad = 1;
- while(vp < vvstart - 1) {
- if(data[vp] != data[vnstart]) {
- bad = 0;
- break;
- }
- vp++;
- }
- if(bad) return 0;
-
- /* 2nd pass: bad = 1 if there's any invalid character in the table. */
- vp = vnstart;
- while(vp < vvstart) {
- unsigned char c = data[vp];
-
- /* treat a null byte as end-of-table, ignore any junk between it and VNTP. */
- if(c == 0) break;
-
- vp++;
-
- /* inverse $ or ( is OK */
- if(c == 0xa4 || c == 0xa8) continue;
-
- /* numbers and letters are allowed, inverse or normal. */
- c &= 0x7f;
- if(c >= 0x30 && c <= 0x39) continue;
- if(c >= 0x41 && c <= 0x5a) continue;
-
- bad++;
- break;
- }
-
- return !bad;
-}
-
/* walk the variable value table, generating variable names.
if write is 0, just return the size the table will be.
if write is 1, actually write the names to memory. */
@@ -287,28 +166,35 @@ int rebuild_vntable(int write) {
while(vv < codestart) {
unsigned char sigil = 0;
/* type: scalar = 0, array = 1, string = 2 */
- unsigned char type = data[vv] >> 6;
- /* fprintf(stderr, "%04x: %04x, %d\n", vv, data[vv], type); */
+ unsigned char type = program[vv] >> 6;
+ /* fprintf(stderr, "%04x: %04x, %d\n", vv, program[vv], type); */
+
+ if(varnum == MAXVARS) {
+ fprintf(stderr, "Warning: skipping variable numbers >=%d in value table.\n", MAXVARS);
+ break;
+ }
- if(varnum != data[vv+1]) {
- fprintf(stderr, "Warning: variable value is corrupt!\n");
+ if(varnum != program[vv+1]) {
+ fprintf(stderr, "Warning: variable #%d value is corrupt!\n", varnum);
}
- varnum++;
switch(type) {
- case 1: varname = arrays++; sigil = 0xa8; break;
- case 2: varname = strings++; sigil = 0xa4; break;
- default: varname = scalars++; break;
+ case TYPE_SCALAR: varname = scalars++; break;
+ case TYPE_ARRAY: varname = arrays++; sigil = 0xa8; break;
+ case TYPE_STRING: varname = strings++; sigil = 0xa4; break;
+ default:
+ fprintf(stderr, "Warning: variable value #%d has unknown type.\n", varnum);
+ break;
}
if(varname < 26) {
- if(write) data[vp] = ('A' + varname);
+ if(write) program[vp] = ('A' + varname);
size++;
} else {
varname -= 26;
if(write) {
- data[vp++] = 'A' + varname / 9;
- data[vp] = '1' + varname % 9;
+ program[vp++] = 'A' + varname / 9;
+ program[vp] = '1' + varname % 9;
}
size += 2;
}
@@ -316,41 +202,25 @@ int rebuild_vntable(int write) {
if(sigil) {
size++;
vp++;
- if(write) data[vp++] = sigil;
+ if(write) program[vp++] = sigil;
} else {
- if(write) data[vp] |= 0x80;
+ if(write) program[vp] |= 0x80;
vp++;
}
vv += 8;
+ varnum++;
}
/* there's supposed to be a null byte at the end of the table, unless
- all 128 table slots are used. */
- if(write) {
- if(varnum < 128) data[vp] = 0;
- /* fixup the VNTD pointer */
- /*
- vntd = vntp + (vp - vnstart);
- fprintf(stderr, "%04x\n", vntd);
- data[4] = vntd & 0xff;
- data[5] = vntd >> 8;
- */
- }
+ all 128 table slots are used... except really, there can be >=129
+ entries, and there's always a null byte. */
+ if(write) program[vp] = 0;
+ size++;
return size;
}
-void adjust_vntable_size(int oldsize, int newsize) {
- int move_by;
- if(oldsize != newsize) {
- move_by = newsize - oldsize;
- if(verbose) fprintf(stderr, "need %d bytes for vntable, have %d, moving VVTP by %d to %04x\n",
- newsize, oldsize, move_by, vvtp + move_by);
- move_code(move_by);
- }
-}
-
int fixvars(void) {
int old_vntable_size, new_vntable_size;
@@ -366,69 +236,172 @@ int fixvars(void) {
return 1;
}
-void print_help(void) {
- fprintf(stderr, "Usage: %s [-v] [-f] [-n] [-g] <inputfile> <outputfile>\n", self);
- fprintf(stderr, "-v: verbose\n");
- fprintf(stderr, "-f: force variable name table rebuild\n");
- fprintf(stderr, "-n: do not rebuild variable name table, even if it's invalid\n");
- fprintf(stderr, "-g: remove trailing garbage, if present\n");
- fprintf(stderr, "-c: check only; no output file\n");
- fprintf(stderr, "Use - as a filename to read from stdin and/or write to stdout\n");
+void write_var_map(void) {
+ FILE *f;
+ int vp, count = 0;
+
+ if(verbose) fprintf(stderr, "Writing variable names to '" MAP_FILE "'.\n");
+ f = fopen(MAP_FILE, "w");
+ if(!f) {
+ perror(MAP_FILE);
+ die("Can't create map file for -w option.");
+ }
+
+ for(vp = vnstart; (vp < vntd) && (program[vp] != 0); vp++) {
+ unsigned char c = program[vp];
+ if(c < 0x80) {
+ fputc(c, f);
+ } else {
+ fputc(c & 0x7f, f);
+ fputc('\n', f);
+ count++;
+ }
+ }
+
+ fclose(f);
+
+ if(verbose) fprintf(stderr, "Wrote %d variable names to '" MAP_FILE "'.\n", count);
}
-void invalid_args(const char *arg) {
- fprintf(stderr, "%s: Invalid argument '%s'\n\n", self, arg);
- print_help();
+void die_mapfile(char *msg, int num) {
+ fprintf(stderr, MAP_FILE ": line %d: %s.\n", num, msg);
exit(1);
}
-FILE *open_file(const char *name, const char *mode) {
- FILE *fp;
- if(!(fp = fopen(name, mode))) {
- perror(name);
- exit(1);
+void check_varname(const unsigned char *name, int line) {
+ int len = strlen((char *)name);
+ int i;
+ unsigned char c = 0, type;
+
+ /* fprintf(stderr, "check_varname(\"%s\", %d)\n", name, line); */
+
+ if(len < 1) die_mapfile("Blank variable name", line);
+ if(len > 128) die_mapfile("Variable name >128 characters", line);
+ if(name[0] < 'A' || name[0] > 'Z')
+ die_mapfile("Invalid variable name: First character must be a letter", line);
+
+ for(i = 1; i < len; i++) {
+ c = name[i];
+ if(c >= 'A' && c <= 'Z') continue;
+ if(c >= '0' && c <= '9') continue;
+ if(c == '$' || c == '(') {
+ if(i == (len - 1))
+ continue;
+ else
+ die_mapfile("Invalid variable name: $ and ( only allowed at end", line);
+ }
+ die_mapfile("Invalid character in variable name", line);
+ }
+
+ if(c == 0) c = name[0];
+
+ /* c now has the last char of the name, make sure it matches the variable type */
+ type = program[vvstart + 8 * (line - 1)] >> 6;
+ /* type: scalar = 0, array = 1, string = 2 */
+ if(type == TYPE_SCALAR) {
+ if(c == '$')
+ die_mapfile("Type mismatch: numeric variable may not end with $", line);
+ else if(c == '(')
+ die_mapfile("Type mismatch: numeric variable may not end with (", line);
+ } else if(type == TYPE_ARRAY) {
+ if(c != '(')
+ die_mapfile("Type mismatch: array variable must end with (", line);
+ } else if(type == TYPE_STRING) {
+ if(c != '$')
+ die_mapfile("Type mismatch: string variable must end with $", line);
+ } else {
+ fprintf(stderr, "Warning: variable value table is corrupt (invalid type).\n");
+ }
+
+ /* check for dups */
+ for(i = 0; i < line - 1; i++) {
+ if(strcmp((char *)name, (char *)varmap[i]) == 0)
+ die_mapfile("duplicate variable name", line);
}
- return fp;
}
-void open_input(const char *name) {
- if(!name) {
- if(freopen(NULL, "rb", stdin)) {
- input_file = stdin;
- return;
- } else {
- perror("stdin");
- exit(1);
+void read_var_map(void) {
+ FILE *f;
+ unsigned char *p = varnames, *curname = varnames;
+ int count = 0, vvcount = (codestart - vvstart) / 8;
+
+ if(verbose) fprintf(stderr, "Reading variable names from " MAP_FILE ".\n");
+ f = fopen(MAP_FILE, "r");
+ if(!f) {
+ perror(MAP_FILE);
+ die("Can't read map file for -r option.");
+ }
+
+ while(!feof(f)) {
+ *p = toupper(fgetc(f)); /* allow lowercase */
+
+ if(*p == ' ' || *p == '\t' || *p == '\r')
+ continue; /* ignore whitespace */
+
+ if(*p == '\n') {
+ *p = '\0';
+ varmap[count++] = curname;
+ check_varname(curname, count);
+ curname = p + 1;
}
+ p++;
+ }
+ fclose(f);
+
+ if(verbose) fprintf(stderr, "Read %d variable names from " MAP_FILE ".\n", count);
+
+ if(vvcount > count) {
+ fprintf(stderr, MAP_FILE ": not enough variables (have %d, need %d).\n", count, vvcount);
+ exit(1);
+ } else if(count > vvcount) {
+ fprintf(stderr, MAP_FILE ": too many variables (have %d, need %d).\n", count, vvcount);
+ exit(1);
}
- input_file = open_file(name, "rb");
+ varmap_count = count;
}
-void open_output(const char *name) {
- if(!name) {
- if(isatty(fileno(stdout))) {
- fprintf(stderr, "%s: refusing to write binary data to standard output\n", self);
- exit(1);
- }
- if(freopen(NULL, "wb", stdout)) {
- output_file = stdout;
- return;
- } else {
- perror("stdout");
- exit(1);
+void apply_var_map(void) {
+ unsigned char new_vntable[BUFSIZE];
+ int i, newp = 0;
+ unsigned char *v;
+
+ if(verbose)
+ fprintf(stderr, "Using variable names from " MAP_FILE ".\n");
+
+ for(i = 0; i < varmap_count; i++) {
+ v = varmap[i];
+ while(*v) {
+ new_vntable[newp++] = *v;
+ v++;
}
+ new_vntable[newp - 1] |= 0x80;
}
- output_file = open_file(name, "wb");
+ new_vntable[newp++] = '\0';
+
+ i = vvstart - vnstart;
+ adjust_vntable_size(i, newp);
+ memmove(program + vnstart, new_vntable, newp);
+}
+
+void print_help(void) {
+ printf("Usage: %s [-v] [-f] [-n] [-g] [-c] [-r|-w] <inputfile> <outputfile>\n", self);
+ printf(" -v: Verbose.\n");
+ printf(" -f: Force variable name table rebuild.\n");
+ printf(" -n: Do not rebuild variable name table, even if it's invalid.\n");
+ printf(" -g: Remove trailing garbage, if present.\n");
+ printf(" -c: Check only; no output file.\n");
+ printf(" -w: Write variable names to 'varnames.txt'.\n");
+ printf(" -r: Read variable names from 'varnames.txt'.\n");
+ printf("Use - as a filename to read from stdin and/or write to stdout.\n");
}
void parse_args(int argc, char **argv) {
- self = *argv;
- if(argc < 2) {
- print_help();
- exit(0);
- }
+ set_self(*argv);
+
+ parse_general_args(argc, argv, print_help);
+
while(++argv, --argc) {
if((*argv)[0] == '-') {
switch((*argv)[1]) {
@@ -437,73 +410,84 @@ void parse_args(int argc, char **argv) {
case 'n': keepvars++; break;
case 'g': keepgarbage = 0; break;
case 'c': checkonly = 1; break;
+ case 'r': readmap = 1; break;
+ case 'w': writemap = 1; break;
case 0:
if(!input_file)
open_input(NULL);
- else if(!output_file)
- open_output(NULL);
+ else if(!output_filename)
+ output_filename = *argv;
else
invalid_args(*argv);
break;
default: invalid_args(*argv); break;
}
} else {
+ /* arg doesn't start with a -, must be a filename */
if(!input_file)
open_input(*argv);
- else if(!checkonly && !output_file)
- open_output(*argv);
+ else if(!checkonly && !output_filename)
+ output_filename = *argv;
else
invalid_args(*argv);
}
}
- if(!input_file) die("no input file given (use - for stdin)");
- if(!checkonly && !output_file) die("no output file given (use - for stdout)");
- if(keepvars && forcevars) die("-f and -n are mutually exclusive");
+ if(!input_file) die("No input file given (use - for stdin).");
+ if(!checkonly && !output_filename) die("No output file given (use - for stdout).");
+ if(keepvars && forcevars) die("-f and -n are mutually exclusive.");
+ if(readmap && writemap) die("-r and -w are mutually exclusive.");
+ if(readmap && keepvars) die("-r and -n are mutually exclusive, maybe you want -w?");
+ if(checkonly && (readmap || writemap)) die("-c and -r/-w are mutually exclusive.");
}
int main(int argc, char **argv) {
+ int invoffs = 0;
parse_args(argc, argv);
- filelen = readfile();
- read_header();
-
- if(lomem) die("This doesn't look like an Atari BASIC program (no $0000 signature)");
+ readfile();
+ parse_header();
- if(!keepvars) {
- if(fixvars()) {
- was_protected = 1;
- if(verbose) fprintf(stderr, "Variable names replaced\n");
- } else {
- if(verbose) fprintf(stderr, "Variable names were already OK\n");
+ if(readmap) {
+ was_protected = !vntable_ok();
+ read_var_map();
+ apply_var_map();
+ } else {
+ if(!keepvars) {
+ if(fixvars()) {
+ was_protected = 1;
+ if(verbose) fprintf(stderr, "Variable names replaced.\n");
+ } else {
+ if(verbose) fprintf(stderr, "Variable names were already OK.\n");
+ }
}
}
- if(fixcode()) {
- if(verbose) fprintf(stderr, "Fixed invalid offset in code\n");
+ invoffs = fixcode();
+ if(invoffs) {
+ if(verbose)
+ fprintf(stderr, "Fixed %d invalid offset%s in code.\n",
+ invoffs, (invoffs == 1 ? "" : "s"));
was_protected = 1;
} else {
- if(verbose) fprintf(stderr, "No invalid offsets\n");
+ if(verbose) fprintf(stderr, "No invalid offsets.\n");
}
if(verbose) {
- if(was_protected)
- fprintf(stderr, "Program was protected.\n");
- else
- fprintf(stderr, "Program was NOT protected.\n");
+ fprintf(stderr, "Program was %sprotected.\n", (was_protected ? "" : "NOT "));
}
if(checkonly) {
if(verbose) fprintf(stderr, "Check-only mode; no output written.\n");
- if(was_protected)
- return 0;
- else
- return 2;
+ return was_protected ? 0 : 2;
}
- int got = fwrite(data, 1, filelen, output_file);
- fclose(output_file);
- if(verbose) fprintf(stderr, "wrote %d bytes\n", got);
+ /* we don't open the output file until all processing is done, to
+ avoid leaving invalid output files if we exit on error. */
+ open_output(output_filename);
+ writefile();
+
+ if(writemap) write_var_map();
- return 0;
+ return was_protected ? 0 : 2;
}
diff --git a/unprotbas.rst b/unprotbas.rst
index 28ccd8b..21bbdb1 100644
--- a/unprotbas.rst
+++ b/unprotbas.rst
@@ -11,17 +11,18 @@ Unprotect LIST-protected Atari 8-bit BASIC programs
SYNOPSIS
========
-unprotbas [**-v**] [**-f**] [**-n**] [**-g**] [**-c**] **input-file** **output-file**
+unprotbas [**-v**] [**-f**] [**-n**] [**-g**] [**-c**] [**-r** | **-w**] **input-file** **output-file**
DESCRIPTION
===========
-**unprotbas** modifies a LIST-protected Atari 8-bit BASIC program,
-creating a new non-protected copy. See **DETAILS**, below, to
-understand how the protection and unprotection works.
+**unprotbas** modifies a tokenized LIST-protected Atari 8-bit BASIC
+program, creating a new non-protected copy. See **DETAILS**, below,
+to understand how the protection and unprotection works.
**input-file** must be a tokenized (SAVEd) Atari BASIC program. Use
-*-* to read from standard input.
+*-* to read from standard input, but **unprotbas** will refuse to
+read from standard input if it's a terminal.
**output-file** will be the unprotected tokenized BASIC program. If it
already exists, it will be overwritten. Use *-* to write to standard
@@ -32,13 +33,16 @@ the terminal).
OPTIONS
=======
+Options may appear in any order. The first non-option argument is used
+for **input-file**; the second is **output-file**. A third non-option
+argument is an error.
+
Option bundling is not supported, use e.g. **-v -f**, not **-vf**.
To use filenames beginning with *-*, write them as *./-file*, or they
will be treated as options.
-**-v**
- Verbose operation.
-
+Unprotection Options
+--------------------
**-f**
Force the variable name table to be rebuilt, even if it looks OK.
This option cannot be combined with **-n**.
@@ -56,6 +60,20 @@ will be treated as options.
memory, but doesn't write the result anywhere. In this mode, there
is no **output-file**.
+**-w**
+ Write the variable names to **varnames.txt**, one per line.
+ This can be edited, and later used with **-r** to set the variable names
+ to something sensible rather than A, B, C, etc. For an unprotected
+ program, you can use **-n** to write the existing names rather than
+ generating new ones. See **VARIABLE NAMES**, below. If **varnames.txt**
+ already exists, it will be overwritten.
+
+**-r**
+ Read variable names from **varnames.txt**, and use them instead of
+ generating the names. See **VARIABLE NAMES**, below.
+
+.. include:: genopts.rst
+
EXIT STATUS
===========
@@ -114,7 +132,7 @@ Variable name table scrambling
names in the program, the recovery process just invents new ones,
named A through Z, A1 through A9, B1 through B9, etc, etc. It'll
require human intelligence to figure out what each variable is for,
- since the names are meaningless.
+ since the names are meaningless. See **VARIABLE NAMES**, below.
The **output-file** may not be the exact size that the
**input-file** was. Some types of variable-name scrambling shrink
@@ -124,11 +142,17 @@ Variable name table scrambling
generates only one- and two-character variable names, so the rebuilt
table might be smaller.
+ The program **PROTECT.BAS**, found on Disk 2 of the Holmes Archive,
+ creates protected BASIC programs that only use variable name
+ scrambling.
+
+ **protbas**\(1) also does variable name scrambling.
+
Bad next-line pointer
Every line of tokenized BASIC contains a line length byte, which
- BASIC uses as a pointer to the next line of code. Before printing
- the READY prompt, BASIC iterates over every line of code in the
- program, using the next-line pointers, in order to delete any
+ BASIC uses as a pointer to the next line of code. Before executing
+ an immediate mode command, BASIC iterates over every line of code in
+ the program, using the next-line pointers, in order to delete any
existing line 32768 (the previous immediate mode command). If any
line's pointer is set to zero, that means it points to itself.
@@ -138,28 +162,53 @@ Bad next-line pointer
after LOADing such a file, *nothing* will work (even pressing RESET
won't get you out of it). The only way to use such a program is to
use the RUN command with a filename, and if the program ever exits
- (due to END, STOP, an error, or the Break key), BASIC will get stuck
- again.
+ (due to END, STOP, an error, Break key, or even System Reset), BASIC
+ will get stuck again.
- This doesn't *have* to be done with the last line in the
- program. The "poisoned" line could be followed by more lines of
- code, though they could never actually execute.
+ This doesn't *have* to be done with the last line in the program,
+ though it normally is. The "poisoned" line can never be executed (or
+ BASIC will lock up), but it could be followed by more lines of code
+ (which also could never be executed).
Line 32100 in the example above does this job, taking advantage of
the STMCUR pointer used by BASIC, which holds the address of the
line of tokenized code currently being executed.
- **unprotbas** fixes this simply by calculating what the pointer
- should be (based on the tokens in the line) and changing it. No
- information is lost by doing this.
+ Each statement in the line also has a statement-length byte. For
+ lines with only one statement, its value is the same as the line
+ length. For lines with multiple statements (separated by *:*), it's
+ a pointer to the next statement, counting from the start of the
+ current line. For the last statement on a line, it's a pointer to
+ the next line of code, meaning it's identical to the line length.
+
+ **unprotbas** fixes bad line lengths by setting the line length to
+ the statement length of the last statement. No information is lost
+ by doing this.
+
+ The program **UNPROTEC**, from the *Pirate's Treasure Chest*, can
+ fix bad pointers in protected programs, though it doesn't do
+ anything about variable name scrambling.
+
+ **protbas** also does this type of protection.
One more thing **unprotbas** can do is remove extra data from the end
of the file. It's possible for BASIC files to contain extra data that
-occurs after the end of the program. Some programs use this as a way
-to load arbitrary binary data into memory along with the program; for
-other programs, the extra data is truly garbage (e.g. an EOF character
-if the file came from a CP/M system, or padding to a block size if a
-dumb implementation of XMODEM was used to transfer the file).
+occurs after the end of the program. Such data might be:
+
+- Pre-defined strings and/or arrays, saved with the program by
+ modifying the STARP pointer.
+
+- Arbitrary binary data used by the program at runtime, such as
+ machine language routines, or fonts.
+
+- Zero bytes, caused by SAVEing the program with revision B BASIC. Every
+ time a program is LOADed, edited (or not) and then SAVEd again, 16
+ bytes of extra (garbage) data gets added to the program. To avoid
+ this, don't use revision B (use rev C if possible, A otherwise).
+
+- Garbage added by some system previously used to store or transmit
+ the file. CP/M systems might add an EOF (^Z) character. Dumb
+ file transfer software might pad the file up to its block size.
Normally, such "garbage" doesn't hurt anything. BASIC ignores it. Or
it normally does... if you suspect it's causing a problem, you can
@@ -167,4 +216,73 @@ remove it with the **-g** option. If removing the "garbage" causes the
program to fail to run, it wasn't garbage! **unprotbas** doesn't
remove extra data by default, to be on the safe side.
+VARIABLE NAMES
+==============
+
+If variable name scrambling was used, the original variable names no
+longer exist. **unprotbas** will generate them, according to these rules:
+
+ The first 26 numeric variables will be called *A* through *Z*. Further
+ numeric variables will be *A1* through *A9*, *B1* through *B9*, etc.
+
+ The first 26 string variables will be *A$* to *Z$*, then *A1$* to
+ *A9$*, *B1$* to *B9$*, etc.
+
+ The first 26 array variables will be *A(* to *Z(*, then *A1(* to
+ *A9(*, *B1(* to *B9(*, etc.
+
+Note that array variables have only the *(* as part of the name. The
+closing *)* is "cosmetic" and not part of the actual name.
+
+To properly reverse-engineer the protected program, it's necessary to assign
+meaningful variable names. **unprotbas** isn't smart enough to do this for you,
+but it can semi-automate the process.
+
+First, run **unprotbas** with the **-w** option. This will create a
+file called **varnames.txt**, containing the generated variable names.
+These are in order, one line per variable name, ending with *$* for strings
+and the *(* for arrays.
+
+Load the unprotected program on the Atari and LIST it (or use **chkbas** to get a
+listing), and edit **varnames.txt** in a text editor.
+
+As you figure out what each variable's purpose is, change its name
+in the text file. When editing the file:
+
+- Don't add or delete any lines.
+- Don't get rid of the *$* or *(* at the end of any line.
+- You may enter the names in lowercase (**unprotbas** will convert them to uppercase).
+- Remember to follow the rules for BASIC variable names:
+ The first character must be a letter, other characters must be a letter
+ or a number, and only the last character can be *$* or *(*.
+- No duplicates of the same type are allowed (you can have *FOO* and *FOO$*,
+ but not two numerics called *FOO*).
+
+When you're finished, re-run **unprotbas**, this time with the **-r**
+option. If all is well, the unprotected program will use your variable
+names, rather than generating new ones. If you broke the rules, you
+should get an informative error message explaining what and where the
+problem is.
+
+This process can also be used for regular unprotected programs. Use
+**-n -w** the first time, to save the existing variable names to
+**varnames.txt** rather than generating new ones.
+
+NOTES
+=====
+
+Atari BASIC has a limit of 128 variables in a program. It's actually
+possible for the variable name table to contain up to 256 variables,
+though the 129th and further ones won't be usable in the program. The
+variable value table can hold more than 256 values, though the
+variable numbers wrap around once they pass 255. The attempt to add
+variables past the 128th causes BASIC to respond with *ERROR- 4*, but
+the variable does get added to the tables. **unprotbas** will preserve
+these extra (useless) entries in the tables.
+
+If there more than 256 entries in the value table, you will see
+"Warning: skipping variable numbers >=256 in value table". This is
+a pathological case, and shouldn't happen with programs that aren't
+deliberately crafted to test this behaviour.
+
.. include:: manftr.rst
diff --git a/ver.rst b/ver.rst
index 6f54bd4..20b1e02 100644
--- a/ver.rst
+++ b/ver.rst
@@ -1 +1 @@
-.. |version| replace:: 0.2.1
+.. |version| replace:: 0.2.2
diff --git a/vxrefbas.1 b/vxrefbas.1
new file mode 100644
index 0000000..1f641e6
--- /dev/null
+++ b/vxrefbas.1
@@ -0,0 +1,154 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "VXREFBAS" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+vxrefbas \- Variable cross-reference for tokenized Atari 8-bit BASIC files
+.SH SYNOPSIS
+.sp
+vxrefbas \fBinput\-file\fP
+.SH DESCRIPTION
+.sp
+\fBvxrefbas\fP reads an Atari 8\-bit BASIC tokenized program and prints a
+list of variables (names and token numbers), each with a list of line
+numbers where the variable is referenced.
+.sp
+String variable names end with \fI$\fP\&. Arrays end with \fI(\fP\&. Numeric
+(scalar) variable names don\(aqt have a special character.
+.sp
+After the list of lines, the reference count is shown in parentheses.
+Multiple references on the same line of code are not counted
+separately, so this is a count of \fIlines\fP that reference the variable.
+Variables that aren\(aqt used by the program are listed as \fI(no
+references)\fP\&.
+.sp
+Each line number may be followed by an \fI=\fP and one or more markers,
+which show the type of variable access.
+.INDENT 0.0
+.TP
+.B \fBA\fP
+Variable is assigned on this line, with \fILET\fP or "implied LET" (e.g.
+\fIA=1\fP).
+.TP
+.B \fBF\fP
+Variable is used as the control variable of a \fIFOR\fP loop on this line.
+.TP
+.B \fBN\fP
+Variable is used in a \fINEXT\fP on this line.
+.TP
+.B \fBD\fP
+The variable is dimensioned (\fIDIM\fP command) on this line. Only applies to
+string and array variables.
+.TP
+.B \fBI\fP
+Variable was \fIINPUT\fP on this line.
+.TP
+.B \fBR\fP
+Variable was \fIREAD\fP on this line.
+.TP
+.B \fBG\fP
+Variable was read with \fIGET\fP on this line.
+.TP
+.B \fBO\fP
+Variable was set by \fINOTE\fP on this line. Sorry, this can\(aqt be \fIN\fP, it\(aqs
+already used for \fINEXT\fP\&.
+.TP
+.B \fBL\fP
+Variable was set by \fILOCATE\fP on this line.
+.UNINDENT
+.sp
+The last line of output shows the total number of variables and the
+number of unreferenced variables.
+.SH OPTIONS
+.sp
+There are no application\-specific options.
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH EXIT STATUS
+.sp
+0 for success, 1 for failure.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/vxrefbas.c b/vxrefbas.c
new file mode 100644
index 0000000..1c4e1ab
--- /dev/null
+++ b/vxrefbas.c
@@ -0,0 +1,167 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "bas.h"
+
+int A, F, N, D, I, R, G, O, L;
+int target_var, lastline;
+unsigned char last_cmd = 0;
+int refcounts[128];
+
+void print_help(void) {
+ printf("Usage: %s [-v] program.bas\n", self);
+ exit(0);
+}
+
+CALLBACK(new_line) {
+ A = F = N = D = I = R = G = O = L = 0;
+}
+
+CALLBACK(end_line) {
+ if(lastline != lineno) return;
+
+ if(A || F || N || D || I || R || G || O || L) {
+ putchar('=');
+ if(A) putchar('A');
+ if(F) putchar('F');
+ if(N) putchar('N');
+ if(D) putchar('D');
+ if(I) putchar('I');
+ if(R) putchar('R');
+ if(G) putchar('G');
+ if(O) putchar('O');
+ if(L) putchar('L');
+ }
+
+ putchar(' ');
+}
+
+CALLBACK(new_command) {
+ last_cmd = tok;
+}
+
+CALLBACK(end_stmt) {
+ last_cmd = 0;
+}
+
+CALLBACK(handle_var) {
+ unsigned char last_tok, next_tok;
+ int was_cmd, was_comma, was_semicolon;
+
+ if(tok != (target_var | 0x80)) return;
+
+ if(lastline != lineno) {
+ printf("%d", lineno);
+ refcounts[target_var]++;
+ }
+
+ lastline = lineno;
+
+ last_tok = program[pos - 1];
+ next_tok = program[pos + 1];
+ was_cmd = (last_tok == last_cmd);
+ was_comma = (last_tok == OP_COMMA);
+ was_semicolon = (last_tok == OP_SEMICOLON);
+
+ switch(last_cmd) {
+ case CMD_LET:
+ case CMD_ILET:
+ if(was_cmd) A = 1;
+ break;
+ case CMD_FOR:
+ if(was_cmd) F = 1;
+ break;
+ case CMD_NEXT:
+ if(was_cmd) N = 1;
+ break;
+ case CMD_DIM:
+ if(was_cmd || was_comma) D = 1;
+ break;
+ case CMD_INPUT: /* INPUT #1;A and INPUT #1,A are both allowed, grr. */
+ if(was_cmd || was_comma || was_semicolon) I = 1;
+ break;
+ case CMD_READ:
+ if(was_cmd || was_comma) R = 1;
+ break;
+ case CMD_GET:
+ if(was_comma) G = 1;
+ break;
+ case CMD_NOTE:
+ if(was_comma) O = 1;
+ break;
+ case CMD_LOCATE:
+ if(next_tok == OP_EOS || next_tok == OP_EOL) L = 1;
+ break;
+ }
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "v")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ default: print_help(); exit(1);
+ }
+ }
+
+ if(optind >= argc)
+ die("No input file given (use - for stdin).");
+ else
+ open_input(argv[optind]);
+}
+
+int main(int argc, char **argv) {
+ unsigned short pos;
+ unsigned short vnpos;
+ int unref = 0;
+
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ readfile();
+ parse_header();
+
+ if(!vntable_ok())
+ die("Program is variable-protected; unprotect it first.");
+
+ on_var_token = handle_var;
+ on_start_line = new_line;
+ on_end_line = end_line;
+ on_cmd_token = new_command;
+ on_end_stmt = end_stmt;
+
+ target_var = 0;
+ vnpos = vnstart;
+
+ /* walk the variable value table */
+ for(pos = vvstart; pos < codestart; pos += 8) {
+ /* print the variable name */
+ while(program[vnpos] < 0x80)
+ putchar(program[vnpos++]);
+ putchar(program[vnpos++] & 0x7f);
+ printf("/%02x: ", target_var | 0x80);
+
+ lastline = -1;
+ walk_all_code();
+
+ if(!refcounts[target_var]) {
+ unref++;
+ printf("(no references)");
+ } else {
+ printf("(%d)", refcounts[target_var]);
+ }
+ putchar('\n');
+
+ /* ignore any ERROR-4 vars, since they don't have tokens anyway. */
+ if(++target_var == 128) break;
+ }
+
+ printf(" %d variables, %d unreferenced.\n", target_var, unref);
+ return 0;
+}
diff --git a/vxrefbas.rst b/vxrefbas.rst
new file mode 100644
index 0000000..d77e6c5
--- /dev/null
+++ b/vxrefbas.rst
@@ -0,0 +1,80 @@
+========
+vxrefbas
+========
+
+--------------------------------------------------------------
+Variable cross-reference for tokenized Atari 8-bit BASIC files
+--------------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+
+vxrefbas **input-file**
+
+DESCRIPTION
+===========
+
+**vxrefbas** reads an Atari 8-bit BASIC tokenized program and prints a
+list of variables (names and token numbers), each with a list of line
+numbers where the variable is referenced.
+
+String variable names end with *$*. Arrays end with *(*. Numeric
+(scalar) variable names don't have a special character.
+
+After the list of lines, the reference count is shown in parentheses.
+Multiple references on the same line of code are not counted
+separately, so this is a count of *lines* that reference the variable.
+Variables that aren't used by the program are listed as *(no
+references)*.
+
+Each line number may be followed by an *=* and one or more markers,
+which show the type of variable access.
+
+**A**
+ Variable is assigned on this line, with *LET* or "implied LET" (e.g.
+ *A=1*).
+
+**F**
+ Variable is used as the control variable of a *FOR* loop on this line.
+
+**N**
+ Variable is used in a *NEXT* on this line.
+
+**D**
+ The variable is dimensioned (*DIM* command) on this line. Only applies to
+ string and array variables.
+
+**I**
+ Variable was *INPUT* on this line.
+
+**R**
+ Variable was *READ* on this line.
+
+**G**
+ Variable was read with *GET* on this line.
+
+**O**
+ Variable was set by *NOTE* on this line. Sorry, this can't be *N*, it's
+ already used for *NEXT*.
+
+**L**
+ Variable was set by *LOCATE* on this line.
+
+The last line of output shows the total number of variables and the
+number of unreferenced variables.
+
+OPTIONS
+=======
+
+There are no application-specific options.
+
+.. include:: genopts.rst
+
+EXIT STATUS
+===========
+
+0 for success, 1 for failure.
+
+.. include:: manftr.rst
diff --git a/whichbas.1 b/whichbas.1
new file mode 100644
index 0000000..6be299f
--- /dev/null
+++ b/whichbas.1
@@ -0,0 +1,299 @@
+.\" Man page generated from reStructuredText.
+.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.TH "WHICHBAS" 1 "2025-03-26" "0.2.2" "Urchlay's Atari 8-bit Tools"
+.SH NAME
+whichbas \- Determine BASIC variant of a tokenized Atari 8-bit program
+.SH SYNOPSIS
+.sp
+whichbas [\-v] \fIinput\-file\fP [\fIinput\-file\fP ...]
+.SH DESCRIPTION
+.sp
+\fBwhichbas\fP reads tokenized Atari 8\-bit BASIC, Turbo BASIC, BASIC
+XL, BASIC XE, BASIC/A+, OSS Integer BASIC, or Atari Microsoft BASIC
+programs and attempts to discover which BASIC is required to run each
+one.
+.sp
+Note: OSS Integer BASIC is \fInot\fP to be confused with Apple II Integer BASIC!
+.sp
+\fIinput\-file\fPs must be actual files. \fBwhichbas\fP can\(aqt read from
+standard input, because it seeks in the input file.
+.sp
+With multiple \fIinput\-file\fPs, the output is one line per file,
+with the filename, a tab, and the detected BASIC. With only one
+\fIinput\-file\fP, the filename and tab are not printed.
+.SH OPTIONS
+.sp
+\fINote\fP: none of the options \fB\-s\fP \fB\-k\fP \fB\-v\fP are allowed
+when checking multiple files; they only work if there\(aqs just one
+\fIinput\-file\fP argument.
+.SS Detection Options
+.INDENT 0.0
+.TP
+.B \fB\-s\fP
+Script (or silent) mode. Instead of printing a human\-readable
+name like "Turbo BASIC XL" or "OSS BASIC XE" to stdout, \fBwhichbas\fP
+will print nothing on standard output, but will exit with a status
+indicating what it detected. The caller can check the return status
+(e.g. the \fB$?\fP variable in Bourne/POSIX shells, or \fBERRORLEVEL\fP
+in MS\-DOS or Windows). See \fBEXIT STATUS\fP, below.
+.TP
+.B \fB\-k\fP
+Keep going. The default is to stop looking at the program if the
+BASIC type gets narrowed down to either Turbo BASIC or BASIC XE.
+This option also enables \fB\-v\fP (verbose). It\(aqs really only useful
+for testing, if you\(aqre hacking on \fBwhichbas\fP itself.
+.UNINDENT
+.SS General Options
+.INDENT 0.0
+.TP
+.B \fB\-\-help\fP
+Print usage message and exit.
+.TP
+.B \fB\-\-version\fP
+Print version number and exit.
+.TP
+.B \fB\-v\fP
+Verbose operation. When displaying a number in verbose mode, it will
+be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal.
+.UNINDENT
+.SH NOTES
+.sp
+Atari BASIC programs are detected \fIalmost\fP 100% reliably. See \fBBUGS\fP, below,
+for the gory details.
+.sp
+Turbo BASIC, BASIC XL, and BASIC XE are all supersets of Atari BASIC.
+If you wrote a program using one of them, but didn\(aqt use any of the
+extra commands or functions, the result is still an Atari BASIC program.
+Likewise, if you wrote a program using BASIC XE, but only used the
+commands/functions it has in common with BASIC XL, it would be
+detected as BASIC XL.
+.sp
+There are two types of BASIC XE programs: regular and \fIEXTEND\fPed. The
+extended type is detected 100% reliably, because the first byte of the
+file changes from \fB$00\fP to \fB$DD\fP\&. Non\-extended programs are only
+identified as BASIC XE if they use any of the extra commands BASIC XE
+adds to those found in BASIC XL.
+.sp
+Detection of Turbo vs. BXL/BXE isn\(aqt 100% reliable, and probably
+never will be. There\(aqs too much overlap between the sets of extra
+tokens added by each. Programs that don\(aqt use very many of the extra
+functions provided by Turbo/BXL/BXE may show up as "Either Turbo BASIC XL
+or OSS BASIC XL".
+.sp
+Atari Microsoft BASIC is detected by checking that:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+the first byte of the file is \fB$00\fP\&.
+.IP \(bu 2
+the next 2 bytes (LSB/MSB) are the same as the actual file length minus 3.
+.IP \(bu 2
+the last 3 bytes of the file are zero.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+This may result in false positives (files that aren\(aqt BASIC programs at
+all might show up as Microsoft). Also, no distinction is made between
+Atari MS BASIC 1.0 and 2.0.
+.sp
+OSS BASIC/A+ is an extended form of Atari BASIC. It\(aqs source
+compatible with Atari BASIC, but not token\-compatible because it uses
+different token numbers for the regular BASIC commands and operators.
+Example: SAVE is token \fB$19\fP in Atari BASIC (also Turbo/BXL/BXE),
+but in A+ it\(aqs token \fB$1D\fP\&. Detection should be 100% reliable, but
+since there aren\(aqt many BASIC/A+ programs in the wild, it hasn\(aqt been
+thoroughly tested.
+.sp
+OSS Integer BASIC is a product that was developed by OSS, but never
+released until recently. It\(aqs similar to BASIC XL and XE, but uses
+16\-bit integers for all numeric operations, rather than 6\-byte BCD
+floating point. Integer BASIC\(aqs SAVEd programs are recognized by the
+first two bytes, which are always \fB$77\fP \fB$00\fP\&. There are two known
+versions of Integer BASIC (disk and cartridge), which use different
+command tokens; \fBwhichbas\fP detects which version by looking at the
+token SAVE or CSAVE command at the end of the file.
+.sp
+Various non\-BASIC files are detected (including Mac/65 source,
+ELF binaries, etc) as a convenience, but I wouldn\(aqt rely on
+\fBwhichbas\fP\(aqs non\-BASIC file type detection if I were you.
+If you need the \fBfile\fP(1) command, use it.
+.sp
+\fBwhichbas\fP knows nothing about other BASICs such as Frost BASIC or
+Altirra BASIC.
+.sp
+When using multiple \fIinput\-file\fP arguments, a separate instance of
+\fBwhichbas\fP is spawned for each file. This isn\(aqt the most efficient
+approach, but it shouldn\(aqt cause problems on reasonably modern
+systems.
+.SH BUGS
+.SS Misdetection
+.sp
+It\(aqs possible to get a BASIC XL/XE program to misdetect as Atari BASIC
+by writing a program that does these things:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+Dimension a string array with a number of elements that isn\(aqt just a
+numeric constant or numeric variable (e.g. \fIDIM A$(2+2,10)\fP or
+\fIDIM A$(I*2,10)\fP). The code that detects a string array \fIDIM\fP command
+can only handle simple cases like \fIDIM A$(10,10)\fP or \fIDIM A$(I,10)\fP\&.
+It doesn\(aqt actually matter if the 2nd argument is a fancy expression,
+though.
+.IP \(bu 2
+Does \fInot\fP actually \fIuse\fP the string array variable by assigning to
+it or reading a value from it. String array accesses in BASIC XL/XE
+are reliably detected because they require a semicolon after the
+first number, even if there isn\(aqt a 2nd number. Example: \fI? A$(2;)\fP
+prints the 2nd element of the \fIA$\fP string array. If it were written
+as \fI? A$(2)\fP, but \fIA$\fP is a string array (not a regular string),
+BASIC XL/XE would give an \fIError 40\fP (string type mismatch) at
+runtime.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+The good news is, such a program will still work fine in Atari BASIC.
+Atari BASIC will dimension it as a regular string variable and ignore
+the 2nd dimension. Since it\(aqs not actually used elsewhere in the program,
+it doesn\(aqt hurt anything.
+.SH EXIT STATUS
+.sp
+Without the \fB\-s\fP option, exit status is 0 for success, non\-zero for
+failure.
+.sp
+With the \fB\-s\fP option, the exit status is:
+.INDENT 0.0
+.TP
+.B \fB0\fP
+Not used with \fB\-s\fP\&.
+.TP
+.B \fB1\fP or \fB2\fP
+Error reading file. Error message will be printed on standard error.
+.TP
+.B \fB3\fP
+Atari BASIC detected.
+.TP
+.B \fB4\fP
+Turbo BASIC detected.
+.TP
+.B \fB5\fP
+OSS BASIC XL detected.
+.TP
+.B \fB6\fP
+Non\-EXTENDed OSS BASIC XE detected.
+.TP
+.B \fB7\fP
+Turbo BASIC or BASIC XL (undecided which).
+.TP
+.B \fB8\fP
+Turbo BASIC or non\-EXTENDed BASIC XE (undecided which).
+.TP
+.B \fB9\fP
+Turbo BASIC, BASIC XL, or non\-EXTENDed BASIC XE (undecided which).
+.TP
+.B \fB10\fP
+Unknown Atari BASIC derivative (not Atari BASIC, but not
+Turbo/BXL/BXE/A+ either).
+.TP
+.B \fB11\fP
+Atari Microsoft BASIC detected.
+.TP
+.B \fB12\fP
+EXTENDed OSS BASIC XE detected.
+.TP
+.B \fB13\fP
+Compiled Turbo BASIC detected.
+.TP
+.B \fB14\fP
+OSS BASIC/A+ detected.
+.TP
+.B \fB15\fP
+OSS Integer BASIC (cartridge version) detected.
+.TP
+.B \fB16\fP
+OSS Integer BASIC (disk version) detected.
+.TP
+.B \fB64\fP
+None of the above; not BASIC.
+.UNINDENT
+.sp
+In the future, more exit codes may be defined (in the range \fB15\fP to
+\fB63\fP), but the existing ones will not change.
+.SH COPYRIGHT
+.sp
+WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details.
+.SH AUTHOR
+.INDENT 0.0
+.IP B. 3
+Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&.
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBa8cat\fP(1),
+\fBa8eol\fP(1),
+\fBa8xd\fP(1),
+\fBatr2xfd\fP(1),
+\fBatrsize\fP(1),
+\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
+\fBblob2c\fP(1),
+\fBblob2xex\fP(1),
+\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
+\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
+\fBf2toxex\fP(1),
+\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
+\fBrom2cart\fP(1),
+\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
+\fBxexamine\fP(1),
+\fBxexcat\fP(1),
+\fBxexsplit\fP(1),
+\fBxfd2atr\fP(1),
+\fBxex\fP(5),
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
+.sp
+Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
+Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
+.\" Generated by docutils manpage writer.
+.
diff --git a/whichbas.c b/whichbas.c
new file mode 100644
index 0000000..001d8d8
--- /dev/null
+++ b/whichbas.c
@@ -0,0 +1,1271 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <sys/wait.h>
+
+#include "bas.h"
+#include "whichbas.h"
+
+#define BT_INVALID 0
+#define BT_ATARI 1
+#define BT_TURBO 2
+#define BT_BXL 4
+#define BT_BXE 8
+
+#define BT_BXL_BXE (BT_BXL | BT_BXE)
+
+int bas_type = 0x0f; /* start out with all enabled */
+
+int script_mode = 0; /* -s flag */
+int script_ret; /* -s mode, exit with one of SRET_* from whichbas.h as status */
+
+int keep_going = 0; /* -k flag */
+
+int comma_count; /* count of regular commas (not string/array) in statement */
+unsigned char last_cmd;
+unsigned char last_op_tok;
+unsigned short last_cmd_pos;
+
+void print_help(void) {
+ printf("Usage: %s [-v] [-h] [-k] [-s] <inputfile> ...\n", self);
+}
+
+int child_errs = 0;
+
+/* return true if the child ran and returned 0 (success) */
+int spawn_child(const char **args) {
+ pid_t pid, status;
+ int wstatus;
+
+ pid = fork();
+ if(pid == -1) {
+ perror("fork()");
+ die("Can't spawn child process");
+ } else if(pid) {
+ /* we are the parent */
+ status = waitpid(pid, &wstatus, 0);
+ if(status < 0) {
+ perror("waitpid()");
+ die("Child process went south");
+ }
+ if(! (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0) ) {
+ child_errs++;
+ return 0;
+ }
+ } else {
+ /* we are the child */
+ if(execv(args[0], (char * const *)args) < 0) {
+ perror("exec()");
+ exit(1);
+ }
+ }
+
+ return 1;
+}
+
+/* this is not the ideal way to handle multiple files. it forks a new
+ process for each one. however, I embedded a bunch of die() calls
+ in bas.c, thinking I'd never use some of the functions more than once
+ in the same run. what I get for trying to KISS... */
+void multiple_files(const char *argv0, char **list) {
+ const char *args[5]; /* 5 because eventually we include -k and/or -v */
+ int kidstat;
+
+ /* this isn't needed for things to work, but if I write buggy code,
+ it avoids a forkbomb. */
+ setenv("WHICHBAS_MULTI_PARANOIA", "1", 1);
+
+ args[0] = argv0;
+ args[2] = NULL;
+
+ while(*list) {
+ args[1] = *list;
+ printf("%s:\t", *list);
+ fflush(stdout);
+ kidstat = spawn_child(args);
+ if(!kidstat) puts("(detection failed)");
+ fflush(stdout);
+ list++;
+ }
+
+ if(child_errs) {
+ fprintf(stderr, "%s: exiting with error status because some files failed.\n", self);
+ exit(1);
+ } else {
+ exit(0);
+ }
+}
+
+void parse_args(int argc, char **argv) {
+ int opt;
+
+ while( (opt = getopt(argc, argv, "vksh")) != -1) {
+ switch(opt) {
+ case 'v': verbose = 1; break;
+ case 'k': keep_going = verbose = 1; break;
+ case 's': script_mode = 1; break;
+ case 'h': print_help(); exit(0);
+ default:
+ print_help();
+ exit(1);
+ }
+ }
+
+ if(optind >= argc)
+ die("No input file given (and stdin not supported).");
+
+ if(optind == argc - 1) { /* got one filename only */
+ open_input(argv[optind]);
+ if(input_file == stdin)
+ die("Reading from standard input not supported.");
+ } else { /* got multiple filenames */
+ if(keep_going || verbose || script_mode)
+ die("-k, -v, -s not supported with multiple filenames (yet?)");
+ if(getenv("WHICHBAS_MULTI_PARANOIA"))
+ die("BUG: multiple_files() recursion!");
+ multiple_files(argv[0], argv + optind);
+ }
+}
+
+/* don't need this.
+void add_type(int type) {
+ bas_type |= type;
+}
+*/
+
+void print_result(void) {
+ const char *name;
+
+ if(verbose) fprintf(stderr, " final bas_type %02x\n", bas_type);
+
+ if(bas_type == BT_INVALID) {
+ name = "Unknown variant: Not Atari BASIC, Turbo, BXL, or BXE";
+ script_ret = SRET_UKNOWN_DERIV;
+ } else if(bas_type & BT_ATARI) {
+ name = "Atari BASIC";
+ script_ret = SRET_ATARI;
+ } else if(bas_type & BT_TURBO) {
+ if(bas_type & BT_BXL) {
+ name = "Either Turbo BASIC XL or OSS BASIC XL";
+ script_ret = SRET_TURBO_OR_BXL;
+ } else if(bas_type & BT_BXE) {
+ name = "Either Turbo BASIC XL or OSS BASIC XE";
+ script_ret = SRET_TURBO_OR_BXE;
+ } else { /* bas_type == BT_TURBO */
+ name = "Turbo BASIC XL";
+ script_ret = SRET_TURBO;
+ }
+ } else if(bas_type == BT_BXL || bas_type == (BT_BXL | BT_BXE)) {
+ name = "OSS BASIC XL";
+ script_ret = SRET_BXL;
+ } else if(bas_type == BT_BXE) {
+ name = "OSS BASIC XE";
+ script_ret = SRET_BXE;
+ } else {
+ /* this one should never happen: */
+ name = "Either Turbo BASIC XL, OSS BASIC XL, or OSS BASIC XE";
+ script_ret = SRET_TURBO_OR_BXL_OR_BXE;
+ }
+
+ if(script_mode) {
+ exit(script_ret);
+ } else {
+ puts(name);
+ exit(0);
+ }
+}
+
+/* return true if a token is numeric constant
+ (including TB/BXE/BXL hex) */
+int is_numconst_op(unsigned char tok) {
+ switch(tok) {
+ case OP_NUMCONST:
+ case OP_HEXCONST:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/* return true if a token is a function that *returns*
+ a numeric value (says nothing about the argument types,
+ though!) */
+int is_numeric_func(unsigned char tok) {
+ switch(tok) {
+ case OP_FUNC_USR:
+ case OP_FUNC_ASC:
+ case OP_FUNC_VAL:
+ case OP_FUNC_LEN:
+ case OP_FUNC_ADR:
+ case OP_FUNC_ATN:
+ case OP_FUNC_COS:
+ case OP_FUNC_PEEK:
+ case OP_FUNC_SIN:
+ case OP_FUNC_RND:
+ case OP_FUNC_FRE:
+ case OP_FUNC_EXP:
+ case OP_FUNC_LOG:
+ case OP_FUNC_CLOG:
+ case OP_FUNC_SQR:
+ case OP_FUNC_SGN:
+ case OP_FUNC_ABS:
+ case OP_FUNC_INT:
+ case OP_FUNC_PADDLE:
+ case OP_FUNC_STICK:
+ case OP_FUNC_PTRIG:
+ case OP_FUNC_STRIG:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/* return true if a token is an arithmetic operator */
+int is_arith_op(unsigned char tok) {
+ switch(tok) {
+ case OP_UPLUS: /* not sure these two... */
+ case OP_UMINUS: /* ...really belong here */
+ case OP_NUM_LE:
+ case OP_NUM_NE:
+ case OP_NUM_GE:
+ case OP_NUM_LT:
+ case OP_NUM_GT:
+ case OP_NUM_EQ:
+ case OP_POWER:
+ case OP_MULT:
+ case OP_PLUS:
+ case OP_MINUS:
+ case OP_DIVIDE:
+ case OP_NOT:
+ case OP_OR:
+ case OP_AND:
+ case OP_NUM_ASSIGN:
+ case OP_GRP_LPAR: /* yes, this belongs here, (((A$))) is a syntax error! */
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+int is_numeric_var(unsigned char tok) {
+ int vartype;
+
+ if(tok < 0x80)
+ return 0;
+
+ vartype = get_vartype(tok);
+ return (vartype == TYPE_SCALAR || vartype == TYPE_ARRAY);
+}
+
+/* return true if a token is:
+ - a numeric constant (including hex constants),
+ - a numeric variable (including arrays),
+ - a function that returns a numeric (e.g. ASC(), SIN()).
+ for now, only standard Atari BASIC tokens are considered.
+ unary minus and plus make sense here, but binary ops don't.
+ */
+int is_numeric_rval(unsigned char tok) {
+ return
+ (tok == OP_UMINUS) ||
+ (tok == OP_UPLUS) ||
+ is_numconst_op (tok) ||
+ is_numeric_func (tok) ||
+ is_numeric_var (tok) ;
+}
+
+/* return true if a token is:
+ - a numeric constant (including hex constants),
+ - a numeric variable (including arrays),
+ - a math operator (plus, minus, etc),
+ - a function that returns a numeric (e.g. ASC(), SIN()).
+ for now, only standard Atari BASIC tokens are considered.
+ */
+int is_numeric_op(unsigned char tok) {
+ return
+ is_numeric_rval (tok) ||
+ is_arith_op (tok) ;
+}
+
+int is_string_var(unsigned char tok) {
+ return (tok >= 0x80 && (get_vartype(tok) == TYPE_STRING));
+}
+
+int is_string_const(unsigned char tok) {
+ return (tok == OP_STRCONST);
+}
+
+int is_string_exp_op(unsigned char tok) {
+ switch(tok) {
+ case OP_STR_ASSIGN:
+ case OP_STR_LE:
+ case OP_STR_NE:
+ case OP_STR_GE:
+ case OP_STR_LT:
+ case OP_STR_GT:
+ case OP_STR_EQ:
+ case OP_STR_LPAR: /* the ( in: A$(1)="A" */
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+int is_string_func(unsigned char tok) {
+ switch(tok) {
+ case OP_FUNC_STR:
+ case OP_FUNC_CHR:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/* return true if a token is:
+ - a string constant,
+ - a string variable,
+ - a function that returns a string.
+*/
+int is_string_rval(unsigned char tok) {
+ return
+ is_string_const (tok) ||
+ is_string_func (tok) ||
+ is_string_var (tok) ;
+}
+
+/* return true if a token is:
+ - a string constant,
+ - a string variable,
+ - a string expression operator, like OP_STR_LE,
+ - a function that returns a string.
+*/
+int is_string_op(unsigned char tok) {
+ return
+ is_string_rval (tok) ||
+ is_string_exp_op (tok) ;
+}
+
+/* true if an operator token is a string function in BASIC XL (or XE).
+ these tokens are all numeric functions in Turbo, so be sure you
+ know what you're doing! */
+int is_bxl_string_func(unsigned char tok) {
+ switch(tok) {
+ case 0x5c: /* BXL HEX$, Turbo DEC */
+ case 0x66: /* BXL LEFT$, Turbo %0 */
+ case 0x67: /* BXL RIGHT$, Turbo %1 */
+ case 0x68: /* BXL MID$, Turbo %2 */
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+void remove_type(int type) {
+ bas_type &= ((~type) & 0x0f);
+
+ if(keep_going) return;
+
+ /* without -k, stop if it gets narrowed down to one of these 4. */
+ if(bas_type == BT_ATARI || bas_type == BT_TURBO || bas_type == BT_BXE || bas_type == BT_BXL)
+ print_result();
+}
+
+void set_type(int type) {
+ bas_type = type;
+ if(!keep_going) print_result();
+}
+
+CALLBACK(handle_cmd) {
+ int has_args = 0, has_var_arg = 0, vartype = -1;
+ unsigned char nexttok;
+
+ last_cmd = tok;
+ last_cmd_pos = pos;
+ comma_count = 0;
+
+ if(verbose) fprintf(stderr, "handle_cmd: lineno %d, tok $%02x, bas_type was %02x\n", lineno, tok, bas_type);
+
+ nexttok = program[pos + 1];
+ has_args = !(nexttok == OP_EOS || nexttok == OP_EOL);
+ if(nexttok >= 0x80) {
+ has_var_arg = 1;
+ vartype = get_vartype(nexttok);
+ }
+
+ /* this switch is for tokens that are the same in Atari/Turbo/BXL/BXE, but with
+ different semantics. non-Atari-BASIC tokens go in the switch below, not
+ this one. */
+ switch(tok) {
+ /* TB uses the same token for CLOSE as Atari and BXL/BXE, but it allows
+ it to have no argument (meaning, close all IOCBs). SOUND is the same
+ (no args = silence all POKEY channels). */
+ case CMD_CLOSE:
+ case CMD_SOUND:
+ if(!has_args) {
+ set_type(BT_TURBO);
+ }
+ break;
+ case CMD_INPUT:
+ /* TB, BXL, BXE all support INPUT "Prompt",VAR with the same tokenized
+ form. Atari BASIC doesn't allow string constants in INPUT args. */
+ if(has_args) {
+ if(nexttok == OP_STRCONST) {
+ int pos_after_string;
+ remove_type(BT_ATARI);
+ /* TB only: INPUT "Prompt";VAR is also supported (not in BXL/BXE) */
+ pos_after_string = pos + 3 + program[pos + 2];
+ if(verbose)
+ fprintf(stderr,
+ "===> INPUT with string prompt at line %d, "
+ "pos %04x, pos_after_string %04x (token %02x)\n",
+ lineno, pos, pos_after_string, program[pos_after_string]);
+ if(program[pos_after_string] == OP_SEMICOLON) {
+ set_type(BT_TURBO);
+ }
+ }
+ } else { /* has_args is false, oh shit! */
+ fprintf(stderr, "*** INPUT without variable at line %d.\n*** Rev A BASIC bug, program will crash, better fix it!\n", lineno);
+ set_type(BT_ATARI);
+ }
+ break;
+ case CMD_GET:
+ case CMD_PUT:
+ /* TB uses the same tokens for GET and PUT as Atari/BXL/BXE, but it allows
+ the argument to be a variable without a # in front of it. */
+ if(nexttok != OP_HASH) {
+ set_type(BT_TURBO);
+ }
+ /* PARTIAL: we really should detect GET #1,A$. this is Turbo-only, but
+ probably nobody ever uses it because it doesn't seem to *work*,
+ at least not in TB 1.5. A$ always ends up empty with length 0. */
+ break;
+ case CMD_RESTORE:
+ case CMD_TRAP:
+ /* TB allows RESTORE #LABEL and TRAP #LABEL */
+ if(nexttok == OP_HASH) {
+ set_type(BT_TURBO);
+ }
+ break;
+ default: break;
+ }
+
+ if(tok <= CMD_ERROR) return; /* legal in BASIC, ignore */
+ remove_type(BT_ATARI);
+ if(tok >= 0x59) remove_type(BT_BXL);
+
+ if(tok >= 0x65) {
+ fprintf(stderr, "handle_cmd: invalid command %02x at line %d\n", tok, lineno);
+ keep_going = 0;
+ set_type(BT_INVALID);
+ }
+
+ /* we have tokens 0x3a to 0x68 in both TB and BXE, or 47 of them.
+
+ Some tokens can't be determined, because they take the
+ same argument (or lack of) in both Turbo and BXL/XE. These
+ are:
+
+ 0x3c: REPEAT or ELSE (no args either way)
+ 0x46: LOOP or CP (no args either way)
+ 0x49: LOCK or UNPROTECT (take the same args)
+ 0x4B: RENAME in both Turbo and BXL/XE (same token, same args)
+
+ 4 of them, this leaves 43 we can check.
+
+ Covered so far: 41 (95%).
+ However, some of these are marked PARTIAL because they're not detected
+ under all circumstances.
+
+ Unchecked tokens:
+
+ 0x5B: BRUN or CALL (both take a string, CALL allows "USING" though)
+ This isn't really important, as CALL requires a PROCEDURE to
+ exist, and we *do* catch the PROCEDURE token.
+ 0x5F: PAINT (req 2 args) or NUM (optional 2 args).
+ Again, not important, because it's highly unlikely any BXL/BXE
+ program will contain NUM... because when it executes, it stops the
+ program and goes back to the READY prompt (in auto-numbering mode).
+ */
+ switch(tok) {
+ case 0x39: /* MOVE <args> or ENDWHILE */
+ case 0x3a: /* -MOVE <args> or TRACEOFF */
+ case 0x3d: /* UNTIL <args> or ENDIF */
+ case 0x56: /* DEL <args> or FAST */
+ case 0x62: /* CIRCLE (3 or 4 num args) or NORMAL (no args) */
+ /* COMPLETE */
+ if(has_args) {
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x58: /* TRACE (optional + or -), EXTEND (BXE; no args) */
+ /* COMPLETE */
+ /* In BXL, this looks to be an extra END token, that behaves the same
+ as the regular one, but can't be entered in the editor. Assume
+ no BXL program contains this token. */
+ /* In BXE, EXTEND can't actually appear in a program (it's direct
+ mode only). The only way to get EXTEND into a BXE program is
+ to do a direct mode command like:
+ EXTEND:SAVE "D:PROG"
+ ...which of course puts it at line 32768. But this code will
+ never see that, because we'd already detect EXTENDed BXE
+ based on the first 2 bytes of the file.
+ */
+ /* So, if we see this token, it *has* to be Turbo's TRACE, whether
+ or not it has an argument. */
+ set_type(BT_TURBO);
+ break;
+
+ case 0x59: /* TEXT or PROCEDURE */
+ /* COMPLETE */
+ /* Turbo: TEXT (1st arg is number),
+ BXL: invalid token,
+ BXE: PROCEDURE (arg is string const (not var!)) */
+ if(nexttok == OP_STRCONST) {
+ /* this token doesn't seem to be valid in BXL at all */
+ set_type(BT_BXE);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x3f: /* WEND or LOMEM <args> */
+ case 0x40: /* ELSE or DEL <args> */
+ case 0x41: /* ENDIF or RPUT <args> */
+ case 0x45: /* DO or TAB <args> */
+ case 0x47: /* EXIT or ERASE <args> */
+ case 0x51: /* ENDPROC or PMMOVE <args> */
+ /* COMPLETE */
+ if(has_args) {
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x48: /* DIR (optional arg) or PROTECT (req'd arg) */
+ /* PARTIAL: without args means TB, but with arg,
+ it could be either */
+ if(!has_args) {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x4a: /* UNLOCK (req'd arg) or DIR (optional arg) */
+ /* PARTIAL: without args means BXL/BXE, but with arg,
+ it could be either */
+ if(!has_args) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x3b: /* *F (optional + or -), TRACE (no arg) */
+ case 0x5e: /* *B (optional + or -) or EXIT (no arg) */
+ /* PARTIAL: doesn't catch *F or *B by itself with no +/- */
+ if(has_args) {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x44: /* FILLTO or BGET (check for a # after the token) */
+ /* COMPLETE */
+ if(nexttok == OP_HASH) {
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x4e: /* TIME$= (1 string arg) or PMCLR (1 num arg) */
+ /* PARTIAL: but almost complete. nothing happens if it's
+ TIME$= with a string function (probably rare) or PMCLR
+ with a complex expression. */
+ if(nexttok == OP_STRCONST) {
+ remove_type(BT_BXL_BXE);
+ } else if(has_var_arg && vartype == TYPE_STRING) {
+ remove_type(BT_BXL_BXE);
+ } else if(nexttok == OP_NUMCONST) {
+ remove_type(BT_TURBO);
+ } else if(has_var_arg && vartype == TYPE_SCALAR) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x50: /* EXEC (1 arg, *must* be variable) or PMGRAPHICS (1 num arg, may be const) */
+ /* PARTIAL: PMGRAPHICS VAR won't be detected. but this usage is rare. */
+ /* This check is actually redundant, because EXEC requires Turbo's
+ label type (high bits in var name table both set to 1), which we already
+ detected in check_variables(). */
+ if(!has_var_arg) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x54: /* -- in TB, LVAR in BXL/BXE */
+ /* COMPLETE */
+ /* We can tell these apart because:
+ 1. TB gives us a next-statement offset of 5 if -- is the first (or
+ actually only) statement on a line. Normally, the minimum offset
+ is 6, but there's no OP_EOL after this token for some reason.
+ 2. If -- is the 2nd or or later statement on a line (after a colon)
+ it *does* get a statement terminator, but it's 0x9b (ATASCII EOL,
+ like a REM or DATA gets).
+ Note that it's impossible to put more statements *after* the --,
+ they just get ignored if you type them. This doesn't help us
+ here, but it's interesting anyway.
+ Also, the -- is what you type to enter it into the program, but
+ it get LISTed as a line of 30 dashes.
+ The explanation is a lot longer than the code... */
+ if(program[pos - 1] == 0x05 || nexttok == 0x9b) {
+ set_type(BT_TURBO);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x57: /* DUMP (1 optional string arg) or LOCAL (1 *numeric* variable arg) */
+ /* BXL/BXE's LOCAL only works on scalars, not arrays or strings. so if there's
+ no arg, or one string arg... */
+ /* PARTIAL: almost complete, doesn't handle DUMP func$(arg), which I
+ doubt anyone uses anyway. */
+ if(!has_args) {
+ /* only Turbo allows no arg... */
+ remove_type(BT_BXL_BXE);
+ } else if(nexttok == OP_STRCONST) {
+ /* only Turbo allows a string constant arg... */
+ remove_type(BT_BXL_BXE);
+ } else if(has_var_arg && vartype == TYPE_STRING) {
+ /* only Turbo allows a string variable arg... */
+ remove_type(BT_BXL_BXE);
+ } else if(has_var_arg && vartype == TYPE_SCALAR) {
+ /* only BXL/BXL allows a scalar variable arg */
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x5a: /* TB: BLOAD; BXL: extension mechanism; BXE: invalid. */
+ /* COMPLETE */
+ /* This is the token used for the BXL EXTEND.COM added commands,
+ from the Toolkit disk. It's followed by a byte ranging 0x10
+ to 0x15 that specifies which extended command, e.g. 0x5a 0x11 means
+ EXIT, 0x5a 0x12 is PROCEDURE, 0x5a 0x13 is CALL. Although
+ these look like BXE's extra commands, they aren't the same tokens,
+ and BXE will choke on them (RUN causes "Error- 33", LIST causes
+ a lockup). */
+ if(nexttok >= 0x10 && nexttok <= 0x15) {
+ /* worth mentioning to the user... */
+ fprintf(stderr, "Note: program requires EXTEND.COM from BASIC XL Toolkit disk.\n");
+ set_type(BT_BXL);
+ } else {
+ /* it's BLOAD if followed by e.g. OP_STRCONST or a variable */
+ set_type(BT_TURBO);
+ }
+ break;
+
+ case 0x5c: /* GO# (1 arg only) or SORTUP (optional 2nd arg of USING, but no comma) */
+ case 0x5d: /* # (1 arg only) or SORTDOWN (optional 2nd arg of USING, but no comma) */
+ /* COMPLETE but no longer needed (check_variables() already found the
+ 11xxxxxx variables) */
+ /* Turbo BASIC labels have the high 2 bits set to 11, which is illegal
+ in Atari/BXL/BXE. */
+ if(vartype == 3) {
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x60: /* CLS (optional IOCB with #) or HITCLR (no args) */
+ /* PARTIAL: without args, can't tell them apart. */
+ /* I doubt CLS #IOCB is actually used in many Turbo BASIC
+ programs, because it's broken (at least in Turbo 1.5).
+ It's supposed to only clear the screen of output that
+ happened after the OPEN #IOCB, but it really clears the
+ whole screen. */
+ if(nexttok == OP_HASH) {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ default: break;
+ }
+ if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type);
+}
+
+CALLBACK(handle_op) {
+ unsigned char nexttok = program[pos + 1];
+ unsigned char nexttok2 = program[pos + 2];
+
+ if(tok == OP_COMMA) comma_count++;
+
+ if(verbose) fprintf(stderr, "handle_op: lineno %d, tok $%02x, comma_count %d, bas_type was %02x\n", lineno, tok, comma_count, bas_type);
+
+ if(tok == 0x00) {
+ /* Turbo allows 256 variables, tokenizes the first 128 normally ($80-$FF).
+ The extra ones above $FF are tokenized as $00, varnum - $80. None of
+ our other BASICs uses $00 as an operator token, so.. */
+ set_type(BT_TURBO);
+ }
+
+ /* attempt to detect BXL/BXE DIM for 2D string arrays.
+ DIM A$(10,10) is illegal in Atari/Turbo.
+ PARTIAL: this only works if the first dimension is either a
+ constant or a scalar variable (not an array element or an
+ expression). fortunately most programs use constants in DIM.
+ */
+ if(tok == OP_DIM_STR_LPAR) {
+ int str2d = 0;
+ if(nexttok >= 0x80 && nexttok2 == OP_ARR_COMMA) {
+ str2d = 1;
+ } else if(nexttok == OP_NUMCONST || nexttok == OP_HEXCONST) {
+ str2d = (program[pos + 8] == OP_ARR_COMMA);
+ }
+ if(str2d) {
+ if(verbose)
+ fprintf(stderr, "===> found 2d string array at line %d\n", lineno);
+ remove_type(BT_ATARI | BT_TURBO);
+ }
+ }
+
+ /* BXL/BXE allows string concatenation in assignment with the comma,
+ A$="FOO","BAR" or A$=C$,D$. */
+ if(last_cmd == CMD_LET || last_cmd == CMD_ILET) {
+ if(program[last_cmd_pos + 2] == OP_STR_ASSIGN) {
+ if(tok == OP_COMMA) {
+ if(is_string_rval(nexttok)) {
+ remove_type(BT_ATARI | BT_TURBO);
+ }
+ }
+ }
+ }
+
+ if(tok == OP_HEXCONST) remove_type(BT_ATARI); /* hex const (turbo *and* bxl/xe) */
+ if(tok <= OP_FUNC_STRIG) {
+ if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type);
+ return; /* legal in BASIC, ignore */
+ }
+ remove_type(BT_ATARI);
+
+ /* only Turbo has op tokens numbered 0x69 and up. */
+ if(tok >= 0x69) {
+ set_type(BT_TURBO);
+ }
+
+ if(tok >= 0x6E) {
+ fprintf(stderr, "handle_op: invalid operator %02x at line %d\n", tok, lineno);
+ keep_going = 0;
+ set_type(BT_INVALID);
+ }
+
+ /* There are 25 extra operators in Turbo, and 20 of them are shared with
+ BXL/BXE. Of the 20, 4 of them are undecidable, and the rest are
+ covered here, which means 80% coverage of the shared ops.
+ Undecidables are:
+ 0x56 & (logical AND) or % (XOR), both infix numeric ops; can't tell apart
+ 0x57 ! (logical OR) in both Turbo and BXL/BXE, can't tell apart
+ 0x64 RAND (func, 1 num arg) or TAB (func, 1 num arg), can't tell apart
+ 0x65 TRUNC (func, 1 num arg) or PEN (func, 1 num arg), can't tell apart
+ */
+ switch(tok) {
+ case 0x55: /* DPEEK (function) TB, USING (infix, not a function) in BXL/BXE */
+ case 0x58: /* INSTR (function) or & (infix numeric) in BXE. */
+ case 0x5b: /* HEX$ (func, takes 1 num arg) or FIND( (pseudo-func, 3 args */
+ /* COMPLETE */
+ if(nexttok == OP_FUNC_LPAR) {
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x59: /* INKEY$ (0 arg pseudo-func) in TB, string array separator semicolon in BXL/BXE */
+ /* PARTIAL: ...but pretty good. we *can't* check nexttok == OP_GRP_RPAR, because
+ VAL(INKEY$) or ASC(INKEY$) are legit Turbo code. */
+ if(nexttok == OP_EOS || nexttok == OP_EOL) {
+ /* the semicolon can't be the last token on the line (needs at least
+ a right-paren), but INKEY$ can. */
+ remove_type(BT_BXL_BXE);
+ } else if(pos == last_cmd_pos + 1) {
+ /* INKEY$ can be the first operator after the command, e.g if the command
+ is IF. The semicolon cannot. */
+ remove_type(BT_BXL_BXE);
+ } else if(is_string_exp_op(last_op_tok) || is_string_exp_op(nexttok)) {
+ /* A$=INKEY$, IF INKEY$=A$, A$(LEN(A$)+1)=INKEY$, INKEY$<>"A"... */
+ remove_type(BT_BXL_BXE);
+ } else if(is_numeric_op(last_op_tok) || is_numeric_op(nexttok)) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x5a: /* EXOR (infix num op) or BUMP( (pseudo-function, no OP_FUNC_LPAR) */
+ case 0x5d: /* DIV (infix num op) or RANDOM( (pseudo-func, 1 or 2 num args) */
+ /* COMPLETE (I think, anyway) */
+ if(last_op_tok == OP_GRP_RPAR || last_op_tok == OP_NUMCONST || last_op_tok == OP_HEXCONST || last_op_tok >= 0x80) {
+ /* if the last token was a variable or a numeric, or a right paren,
+ this is infix (can't be a function, last token would have to have
+ been a command or a math/etc operator). */
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x5c: /* DEC (function, takes str) in TB, HEX$ (function, takes num) in BXL/BXE */
+ /* COMPLETE */
+ if(is_string_rval(nexttok2)) {
+ remove_type(BT_BXL_BXE);
+ } else if(is_numeric_op(nexttok2)) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x5e: /* FRAC (num func, 1 arg) or DPEEK (num func, 1 arg) in BXL...
+ however BXE has an optional 2nd arg. */
+ {
+ /* PARTIAL: This detects the 2nd arg for simple cases where the
+ 1st arg is a constant or a numeric variable, but not if the
+ 1st arg is an expression or an array element. */
+ int has2 = 0;
+ if(nexttok2 == OP_NUMCONST || nexttok2 == OP_HEXCONST) {
+ if(program[pos + 9] == OP_ARR_COMMA)
+ has2 = 1;
+ } else if(nexttok2 >= 0x80 && program[pos + 3] == OP_ARR_COMMA) {
+ has2 = (get_vartype(nexttok2) == TYPE_SCALAR);
+ }
+ if(has2) {
+ set_type(BT_BXE);
+ }
+ }
+ break;
+
+ case 0x5f: /* TIME$ in TB, SYS (function) in BXL/BXE */
+ case 0x60: /* TIME in TB, VSTICK (function) in BXL/BXE */
+ case 0x61: /* MOD (infix op) in TB, HSTICK (function) in BXL/BXE */
+ case 0x62: /* EXEC (infix op, with ON) in TB, PMADR (function) in BXL/BXE */
+ /* COMPLETE */
+ if(nexttok == OP_FUNC_LPAR) {
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x63: /* RND (pseudo-func, no arg) or ERR (func, 1 num arg) */
+ /* COMPLETE */
+ if(nexttok != OP_FUNC_LPAR) {
+ set_type(BT_TURBO);
+ }
+ break;
+
+ case 0x66: /* %0 in TB, LEFT$( (pseudo-func, takes string) in BXL/BXE */
+ case 0x67: /* %1 in TB, RIGHT$( (pseudo-func, takes string) in BXL/BXE */
+ case 0x68: /* %2 in TB, MID$( (pseudo-func, takes string) in BXL/BXE */
+ /* COMPLETE */
+ /* LEFT$/RIGHT$/MID$ do NOT get OP_FUNC_LPAR (the "(" is part of the
+ token name). They're always followed by a string operator... and
+ it works out that none of the tokens for BXL-only string funcs
+ are allowed to follow %0 %1 %2 in Turbo. */
+ if(is_string_op(nexttok) || is_bxl_string_func(nexttok)) {
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ last_op_tok = tok;
+ if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type);
+}
+
+/* we can count commas, because both Turbo and BXE/BXL use the "array" comma
+ to separate function arguments, not the "regular" comma. */
+CALLBACK(handle_end_stmt) {
+ if(verbose) fprintf(stderr, "handle_end_stmt: lineno %d, tok $%02x, last_cmd $%02x, comma_count %d, bas_type was %02x\n", lineno, tok, last_cmd, comma_count, bas_type);
+ switch(last_cmd) {
+ case 0x38: /* DPOKE (2 args) or WHILE (1 arg) */
+ if(comma_count) {
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x3e: /* WHILE (1 arg) or DPOKE (2 or 3 args) */
+ case 0x4c: /* DELETE (1 arg) or MOVE (3 or 4 args) */
+ case 0x4d: /* PAUSE (1 arg) or MISSILE (3 args) */
+ case 0x52: /* FCOLOR (1 arg) or PMWIDTH (2 args) */
+ case 0x53: /* *L (optional + or - only) or SET (req 2 num args) */
+ case 0x4f: /* PROC (1 arg) or PMCOLOR (3 args) */
+ if(comma_count) { /* 1 arg means no commas */
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x42: /* BPUT or RGET */
+ /* PARTIAL:
+ Turbo BGET always takes 3 args, BXL/BXE RGET takes 2 or more.
+ We can at least rule out Turbo if there aren't exactly 3 args. */
+ if(comma_count != 2) {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x43: /* BGET or BPUT */
+ /* PARTIAL:
+ Turbo BGET and BPUT always take 3 args. So does BXL BPUT.
+ BXE BPUT takes 3 args and an optional 4th. */
+ if(comma_count != 2) {
+ set_type(BT_BXE);
+ }
+ break;
+
+ case 0x55: /* RENUM in both (TB req 3 args, BXL up to two) */
+ if(comma_count == 2) {
+ remove_type(BT_BXL_BXE);
+ } else {
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x61: /* DSOUND (0 or 4 num args) or INVERSE (no args) */
+ /* PARTIAL: can't tell no-argument DSOUND from INVERSE. */
+ if(comma_count) {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ case 0x63: /* %PUT (usually seen with optional #; 1 or 2 args) or BLOAD (1 string arg) */
+ if(comma_count) {
+ /* multiple args */
+ remove_type(BT_BXL_BXE);
+ } else if(program[last_cmd_pos + 1] == OP_STRCONST) {
+ /* one arg, string const. XXX: check var type */
+ remove_type(BT_TURBO);
+ }
+ break;
+
+ case 0x64: /* %GET (usually seen with optional #; 1 or 2 args) or BSAVE (3 args) */
+ if(comma_count == 2) {
+ remove_type(BT_TURBO);
+ } else {
+ remove_type(BT_BXL_BXE);
+ }
+ break;
+
+ default: break;
+ }
+ if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type);
+
+ last_cmd = last_op_tok = 0;
+}
+
+/* return true if input_file is Atari MS BASIC.
+ AMSB files begin with a 3-byte header: 0x00 or 0x01, then 2 byte length
+ (LSB/MSB), which is actually 3 bytes less than the full length of
+ the file (or, it's the length of the file minus the 3-byte header).
+ Also, the files always end with 3 0x00 bytes.
+ We check that the header length is 3 bytes less than the file length,
+ then check for the 3 0x00's at the end... or, if the first byte was 1,
+ meaning "locked program", check for 3 "encrypted" 0x00's at the end.
+ */
+int detect_amsb(void) {
+ int trailing_byte_value = 0, len, c;
+
+ if(verbose) fprintf(stderr, "entering detect_amsb()\n");
+
+ rewind(input_file);
+ c = fgetc(input_file);
+ if(c > 1) return 0;
+ if(c) trailing_byte_value = 0x54;
+ c = fgetc(input_file);
+ if(c == EOF) return 0;
+ len = (fgetc(input_file) << 8) | c;
+
+ if(verbose) fprintf(stderr, "detect_amsb() header len==%d (file size should be %d)\n", len, len + 3);
+
+ fseek(input_file, 0, SEEK_END);
+ c = ftell(input_file);
+ if(verbose) fprintf(stderr, "detect_amsb() file size %d\n", c);
+ if(len != (c - 3)) {
+ if(verbose) fprintf(stderr, "detect_amsb() wrong file size!\n");
+ return 0;
+ }
+
+ if(verbose) fprintf(stderr, "detect_amsb() file size is correct, checking for 3 nulls\n");
+ fseek(input_file, -3, SEEK_END);
+ if(fgetc(input_file) != trailing_byte_value) return 0;
+ if(fgetc(input_file) != trailing_byte_value) return 0;
+ if(fgetc(input_file) != trailing_byte_value) return 0;
+
+ if(verbose) fprintf(stderr, "detect_amsb() found 3 nulls, return 1\n");
+
+ return 1;
+}
+
+void foreign(const char *name, int srval) {
+ if(input_file) fclose(input_file);
+ if(script_mode) {
+ exit(srval);
+ } else {
+ puts(name);
+ exit(0);
+ }
+}
+
+void detect_foreign(void) {
+ int c, d;
+
+ c = fgetc(input_file);
+ d = fgetc(input_file);
+
+ if(c == EOF || d == EOF)
+ die("File is too short to be a BASIC program of any kind.");
+
+ if((c == 0 || c == 0x77) && d == 0) {
+ /* This is why we can't read from stdin. */
+ rewind(input_file);
+ return;
+ }
+
+ if(c == 0xfb && d == 0xc2)
+ foreign("Compiled Turbo BASIC XL", SRET_COMPILED_TURBO);
+
+ if(c == 0xff && d == 0xff)
+ foreign("XEX executable (not BASIC at all!)", SRET_NOT_BASIC);
+
+ if(c == 0xfe && d == 0xfe)
+ foreign("Mac/65 tokenized source (not BASIC at all!)", SRET_NOT_BASIC);
+
+ if(c == 0xdd && d == 0x00)
+ foreign("EXTENDed OSS BASIC XE", SRET_EXTENDED_BXE);
+
+ if(c == 0x7f && d == 'E') {
+ c = fgetc(input_file);
+ d = fgetc(input_file);
+ if(c == 'L' && d == 'F')
+ foreign("ELF executable (not BASIC at all!)", SRET_NOT_BASIC);
+ }
+
+ if((c == 0 || c == 1) && detect_amsb()) {
+ foreign("Atari Microsoft BASIC", SRET_AMSB);
+ }
+
+ if(isdigit(c) && (d == 0x20 || isdigit(d)))
+ foreign("Text file, could be LISTed BASIC (or not)", SRET_NOT_BASIC);
+
+ if(isprint(c) && isprint(d))
+ foreign("Text file (not BASIC at all!)", SRET_NOT_BASIC);
+
+ foreign("Unknown file type (not BASIC at all!)", SRET_NOT_BASIC);
+}
+
+void check_variables(void) {
+ int pos;
+
+ if(vntp == vntd) return;
+
+ /* Unlike Atari BASIC, Turbo variables can have _ in the names.
+ So can BASIC XE, though it's not documented in the BASIC XE
+ Reference Manual that I have.
+ BXL can't have _ in variable names. */
+ for(pos = vnstart; pos < vvstart; pos++) {
+ if((program[pos] & 0x7f) == '_') {
+ remove_type(BT_ATARI | BT_BXL);
+ }
+ }
+
+ /* Also, Turbo line labels (for PROC/EXEC and #/GO#) are variables
+ with a type that's illegal in Atari/BXL/BXE. */
+ for(pos = vvstart; pos < codestart; pos += 8) {
+ if((program[pos] & 0xc0) == 0xc0) {
+ set_type(BT_TURBO);
+ }
+ }
+
+ /* I was hoping to check for BXL/BXE string arrays here. However,
+ looking at a SAVEd file, they look identical to regular string
+ variables (variable type $80, rest of the VVTP entry all $00).
+ When the program's actually in memory, BXL/BXE sets the
+ variable type byte to $91 for DIMed string array var and
+ $81 (same as Atari/Turbo) for a regular DIMed string var.
+ Unfortunately in the SAVE file, it's always $80. */
+
+ /* Another thing that can't be detected: BXL/BXE's FAST mode changes
+ the program in memory (line number targets become addresses),
+ but programs don't get SAVEd this way: SAVE turns off FAST and
+ restores the program to its original state before writing it
+ to disk. Too bad. */
+}
+
+/* BASIC/A+ support is *very* simple. It's similar to BASIC XL (no
+ surprise there)... but unlike Turbo, BXL, and BXE, it's *not*
+ token-compatible with original Atari BASIC. Rather than add
+ their new tokens to the end of the lists, they're mixed in with
+ the others. So A+ can't even LOAD or RUN Atari BASIC files.
+ Appendix J of the BASIC/A+ manual tells you to LIST in BASIC,
+ reboot, ENTER in A+, to "port" your BASIC programs to A+. I
+ suppose if you upgraded from A+ to BASIC XL or XE, you'd have
+ to do the same thing to use A+ programs in XL/XE.
+
+ While this was probably a PITA for BASIC/A+ users back in the day,
+ it makes it *really* easy to detect A+ here. The last line of
+ every SAVEed program is the direct-mode command, and contains either
+ a SAVE or CSAVE cmd token. Which is the same token in Atari, Turbo,
+ BXL, and BXE... but *different* in A+.
+
+ However... I've run into at least one BASIC program in the Holmes
+ Archive that was missing its line 32768 (wish I could remember which).
+ And it's possible for files to get truncated... so I'll check a few
+ other command tokens, to deal with cases like this.
+ */
+void found_aplus(void) {
+ foreign("OSS BASIC/A+", SRET_APLUS);
+}
+
+CALLBACK(check_aplus_cmd) {
+ int has_args;
+ unsigned char nexttok, nexttok2;
+
+ nexttok = program[pos + 1];
+ nexttok2 = program[pos + 2];
+ has_args = !(nexttok == OP_EOS || nexttok == OP_EOL);
+ if(verbose) fprintf(stderr, "check_aplus_cmd: line %d, pos $%04x, tok $%02x, nexttok $%02x, nexttok2 $%02x\n", lineno, pos, tok, nexttok, nexttok2);
+
+ switch(tok) {
+ case CMD_POP: /* A+ READ */
+ case CMD_DOS: /* A+ GET */
+ case CMD_DEG: /* A+ WHILE */
+ case CMD_CLR: /* A+ DIM */
+ case 0x46: /* A+ SOUND <args>, Turbo LOOP, BXL/XE CP */
+ case 0x3c: /* A+ DIR <req'd arg>, Turbo REPEAT, BXL/XE ELSE */
+ if(has_args)
+ found_aplus();
+ break;
+
+ case CMD_SAVE: /* A+ END */
+ case CMD_GRAPHICS: /* A+ STOP */
+ case CMD_DIM: /* A+ ENDWHILE */
+ /* case CMD_GET: */ /* A+ RETURN, but Turbo allows 0 args too! */
+ case 0x38: /* A+ DOS, Turbo DPOKE, BXL/XE WHILE */
+ if(!has_args)
+ found_aplus();
+ break;
+
+ case CMD_POSITION: /* A+ ? */
+ /* PARTIAL: does nothing if 1st arg is numeric. */
+ if(!has_args)
+ /* POSITION can't have 0 args. */
+ found_aplus();
+ else if(is_string_rval(nexttok))
+ /* ? "STRING" or ? A$, e.g., can't be POSITION */
+ found_aplus();
+ else if(nexttok == OP_NUM_LE) /* numeric <= in BASIC, # in A+ */
+ found_aplus();
+ break;
+
+ case CMD_RUN: /* A+ PRINT */
+ /* PARTIAL: only detects PRINT # or PRINT <num> ... */
+ /* A+'s # token is BASIC's OP_NUM_LE! */
+ if(nexttok == OP_NUM_LE)
+ found_aplus();
+ else if(is_numconst_op(nexttok) || is_numeric_var(nexttok))
+ found_aplus();
+ break;
+
+ case CMD_XIO: /* A+ SAVE */
+ /* most programs, this is enough, because they'll end with
+ 32768 SAVE "D:BLAH" */
+ if(is_string_rval(nexttok))
+ found_aplus();
+ break;
+
+ case CMD_OPEN: /* A+ ELSE */
+ /* case CMD_CLOSE: */ /* A+ DEG */ /* can't check, Turbo allows no args */
+ case CMD_STATUS: /* A+ NEW */
+ case CMD_POINT: /* A+ LOAD */
+ case 0x42: /* A+ POSITION, Turbo BPUT, BXL RGET */
+ case 0x43: /* A+ DRAWTO, Turbo BGET, BXL BPUT */
+ if(nexttok != OP_HASH) /* # in BASIC, USING in A+ */
+ found_aplus();
+ break;
+
+ /* case 0x48: */ /* A+ CSAVE, Turbo DIR, BXL/BXE PROTECT */
+ /* DIR without arg is OK, so we can't really check this. */
+ /* break; */
+
+ case CMD_DRAWTO: /* A+ PUT */
+ case CMD_SOUND: /* A+ RPUT */
+ case CMD_LPRINT: /* A+ RGET */
+ case CMD_CSAVE: /* A+ BPUT */
+ case CMD_CLOAD: /* A+ BGET */
+ case CMD_ON: /* A+ STATUS */
+ case CMD_NOTE: /* A+ OPEN */
+ case CMD_CONT: /* A+ CLOSE */
+ case CMD_RAD: /* A+ XIO */
+ if(nexttok == OP_NUM_LE) /* numeric <= in BASIC, # in A+ */
+ found_aplus();
+ break;
+
+ default: break;
+ }
+
+ last_cmd = tok;
+}
+
+void check_oss_int(void) {
+ if(lomem != 0x77) return;
+ switch(save_command_tok) {
+ case 0x19: /* SAVE */
+ case 0x33: /* CSAVE */
+ foreign("OSS Integer BASIC (disk)", SRET_OSSINT_DISK);
+ break;
+ default:
+ foreign("OSS Integer BASIC (cartridge)", SRET_OSSINT_CART);
+ break;
+ }
+}
+
+void check_aplus(void) {
+ allow_hex_const = 1;
+
+ on_cmd_token = check_aplus_cmd;
+ walk_all_code();
+}
+
+void check_atari_turbo_oss(void) {
+ allow_hex_const = 1;
+
+ on_cmd_token = handle_cmd;
+ on_exp_token = handle_op;
+ on_end_stmt = handle_end_stmt;
+
+ walk_all_code();
+}
+
+int main(int argc, char **argv) {
+ set_self(*argv);
+ parse_general_args(argc, argv, print_help);
+ parse_args(argc, argv);
+
+ detect_foreign();
+
+ readfile();
+ parse_header();
+ check_oss_int();
+
+ check_variables();
+ check_aplus();
+ check_atari_turbo_oss();
+
+ print_result(); /* always exits */
+ return 0; /* never happens, shuts up gcc's warning though */
+}
diff --git a/whichbas.h b/whichbas.h
new file mode 100644
index 0000000..0e6bb72
--- /dev/null
+++ b/whichbas.h
@@ -0,0 +1,19 @@
+/* this stuff is in a separate .h file so that eventually,
+ listbas.c can include it (it'll execute "whichbas -s" to detect
+ the BASIC type). */
+
+#define SRET_ATARI 3
+#define SRET_TURBO 4
+#define SRET_BXL 5
+#define SRET_BXE 6
+#define SRET_TURBO_OR_BXL 7
+#define SRET_TURBO_OR_BXE 8
+#define SRET_TURBO_OR_BXL_OR_BXE 9
+#define SRET_UKNOWN_DERIV 10
+#define SRET_AMSB 11
+#define SRET_EXTENDED_BXE 12
+#define SRET_COMPILED_TURBO 13
+#define SRET_APLUS 14
+#define SRET_OSSINT_CART 15
+#define SRET_OSSINT_DISK 16
+#define SRET_NOT_BASIC 64
diff --git a/whichbas.rst b/whichbas.rst
new file mode 100644
index 0000000..f886c76
--- /dev/null
+++ b/whichbas.rst
@@ -0,0 +1,215 @@
+========
+whichbas
+========
+
+----------------------------------------------------------
+Determine BASIC variant of a tokenized Atari 8-bit program
+----------------------------------------------------------
+
+.. include:: manhdr.rst
+
+SYNOPSIS
+========
+whichbas [-v] *input-file* [*input-file* ...]
+
+DESCRIPTION
+===========
+
+**whichbas** reads tokenized Atari 8-bit BASIC, Turbo BASIC, BASIC
+XL, BASIC XE, BASIC/A+, OSS Integer BASIC, or Atari Microsoft BASIC
+programs and attempts to discover which BASIC is required to run each
+one.
+
+Note: OSS Integer BASIC is *not* to be confused with Apple II Integer BASIC!
+
+*input-file*\s must be actual files. **whichbas** can't read from
+standard input, because it seeks in the input file.
+
+With multiple *input-file*\s, the output is one line per file,
+with the filename, a tab, and the detected BASIC. With only one
+*input-file*, the filename and tab are not printed.
+
+OPTIONS
+=======
+
+*Note*\: none of the options **-s** **-k** **-v** are allowed
+when checking multiple files; they only work if there's just one
+*input-file* argument.
+
+Detection Options
+-----------------
+
+**-s**
+ Script (or silent) mode. Instead of printing a human-readable
+ name like "Turbo BASIC XL" or "OSS BASIC XE" to stdout, **whichbas**
+ will print nothing on standard output, but will exit with a status
+ indicating what it detected. The caller can check the return status
+ (e.g. the **$?** variable in Bourne/POSIX shells, or **ERRORLEVEL**
+ in MS-DOS or Windows). See **EXIT STATUS**, below.
+
+**-k**
+ Keep going. The default is to stop looking at the program if the
+ BASIC type gets narrowed down to either Turbo BASIC or BASIC XE.
+ This option also enables **-v** (verbose). It's really only useful
+ for testing, if you're hacking on **whichbas** itself.
+
+.. include:: genopts.rst
+
+NOTES
+=====
+Atari BASIC programs are detected *almost* 100% reliably. See **BUGS**, below,
+for the gory details.
+
+Turbo BASIC, BASIC XL, and BASIC XE are all supersets of Atari BASIC.
+If you wrote a program using one of them, but didn't use any of the
+extra commands or functions, the result is still an Atari BASIC program.
+Likewise, if you wrote a program using BASIC XE, but only used the
+commands/functions it has in common with BASIC XL, it would be
+detected as BASIC XL.
+
+There are two types of BASIC XE programs: regular and *EXTEND*\ed. The
+extended type is detected 100% reliably, because the first byte of the
+file changes from **$00** to **$DD**. Non-extended programs are only
+identified as BASIC XE if they use any of the extra commands BASIC XE
+adds to those found in BASIC XL.
+
+Detection of Turbo vs. BXL/BXE isn't 100% reliable, and probably
+never will be. There's too much overlap between the sets of extra
+tokens added by each. Programs that don't use very many of the extra
+functions provided by Turbo/BXL/BXE may show up as "Either Turbo BASIC XL
+or OSS BASIC XL".
+
+Atari Microsoft BASIC is detected by checking that:
+
+ - the first byte of the file is **$00**\.
+
+ - the next 2 bytes (LSB/MSB) are the same as the actual file length minus 3.
+
+ - the last 3 bytes of the file are zero.
+
+This may result in false positives (files that aren't BASIC programs at
+all might show up as Microsoft). Also, no distinction is made between
+Atari MS BASIC 1.0 and 2.0.
+
+OSS BASIC/A+ is an extended form of Atari BASIC. It's source
+compatible with Atari BASIC, but not token-compatible because it uses
+different token numbers for the regular BASIC commands and operators.
+Example: SAVE is token **$19** in Atari BASIC (also Turbo/BXL/BXE),
+but in A+ it's token **$1D**. Detection should be 100% reliable, but
+since there aren't many BASIC/A+ programs in the wild, it hasn't been
+thoroughly tested.
+
+OSS Integer BASIC is a product that was developed by OSS, but never
+released until recently. It's similar to BASIC XL and XE, but uses
+16-bit integers for all numeric operations, rather than 6-byte BCD
+floating point. Integer BASIC's SAVEd programs are recognized by the
+first two bytes, which are always **$77** **$00**. There are two known
+versions of Integer BASIC (disk and cartridge), which use different
+command tokens; **whichbas** detects which version by looking at the
+token SAVE or CSAVE command at the end of the file.
+
+Various non-BASIC files are detected (including Mac/65 source,
+ELF binaries, etc) as a convenience, but I wouldn't rely on
+**whichbas**\'s non-BASIC file type detection if I were you.
+If you need the **file**\(1) command, use it.
+
+**whichbas** knows nothing about other BASICs such as Frost BASIC or
+Altirra BASIC.
+
+When using multiple *input-file* arguments, a separate instance of
+**whichbas** is spawned for each file. This isn't the most efficient
+approach, but it shouldn't cause problems on reasonably modern
+systems.
+
+BUGS
+====
+Misdetection
+------------
+It's possible to get a BASIC XL/XE program to misdetect as Atari BASIC
+by writing a program that does these things:
+
+ - Dimension a string array with a number of elements that isn't just a
+ numeric constant or numeric variable (e.g. *DIM A$(2+2,10)* or
+ *DIM A$(I*2,10)*). The code that detects a string array *DIM* command
+ can only handle simple cases like *DIM A$(10,10)* or *DIM A$(I,10)*.
+ It doesn't actually matter if the 2nd argument is a fancy expression,
+ though.
+
+ - Does *not* actually *use* the string array variable by assigning to
+ it or reading a value from it. String array accesses in BASIC XL/XE
+ are reliably detected because they require a semicolon after the
+ first number, even if there isn't a 2nd number. Example: *? A$(2;)*
+ prints the 2nd element of the *A$* string array. If it were written
+ as *? A$(2)*, but *A$* is a string array (not a regular string),
+ BASIC XL/XE would give an *Error 40* (string type mismatch) at
+ runtime.
+
+The good news is, such a program will still work fine in Atari BASIC.
+Atari BASIC will dimension it as a regular string variable and ignore
+the 2nd dimension. Since it's not actually used elsewhere in the program,
+it doesn't hurt anything.
+
+EXIT STATUS
+===========
+
+Without the **-s** option, exit status is 0 for success, non-zero for
+failure.
+
+With the **-s** option, the exit status is:
+
+**0**
+ Not used with **-s**.
+
+**1** or **2**
+ Error reading file. Error message will be printed on standard error.
+
+**3**
+ Atari BASIC detected.
+
+**4**
+ Turbo BASIC detected.
+
+**5**
+ OSS BASIC XL detected.
+
+**6**
+ Non-EXTENDed OSS BASIC XE detected.
+
+**7**
+ Turbo BASIC or BASIC XL (undecided which).
+
+**8**
+ Turbo BASIC or non-EXTENDed BASIC XE (undecided which).
+
+**9**
+ Turbo BASIC, BASIC XL, or non-EXTENDed BASIC XE (undecided which).
+
+**10**
+ Unknown Atari BASIC derivative (not Atari BASIC, but not
+ Turbo/BXL/BXE/A+ either).
+
+**11**
+ Atari Microsoft BASIC detected.
+
+**12**
+ EXTENDed OSS BASIC XE detected.
+
+**13**
+ Compiled Turbo BASIC detected.
+
+**14**
+ OSS BASIC/A+ detected.
+
+**15**
+ OSS Integer BASIC (cartridge version) detected.
+
+**16**
+ OSS Integer BASIC (disk version) detected.
+
+**64**
+ None of the above; not BASIC.
+
+In the future, more exit codes may be defined (in the range **15** to
+**63**), but the existing ones will not change.
+
+.. include:: manftr.rst
diff --git a/wtable.c b/wtable.c
new file mode 100644
index 0000000..3c008b3
--- /dev/null
+++ b/wtable.c
@@ -0,0 +1,140 @@
+/* ref:
+https://stackoverflow.com/questions/21737906/how-to-read-write-utf8-text-files-in-c
+*/
+
+#include <stdio.h>
+#include <wchar.h>
+#include "wtable.h"
+
+/*
+#define WSEARCH_DEBUG
+*/
+
+wint_t wchar2ata[][2] = {
+ /* Unicode, ATASCII */
+ { 0x2190, 0x1e },
+ { 0x2191, 0x1c },
+ { 0x2192, 0x1f },
+ { 0x2193, 0x1d },
+ { 0x21b0, 0x7d },
+ { 0x241b, 0x1b },
+ { 0x2501, 0x12 },
+ { 0x2503, 0x02 },
+ { 0x250f, 0x11 },
+ { 0x2513, 0x05 },
+ { 0x2517, 0x1a },
+ { 0x251b, 0x03 },
+ { 0x2523, 0x01 },
+ { 0x252b, 0x04 },
+ { 0x2533, 0x17 },
+ { 0x253b, 0x18 },
+ { 0x254b, 0x13 },
+ { 0x2571, 0x06 },
+ { 0x2572, 0x07 },
+ { 0x2581, 0x0e },
+ { 0x2584, 0x15 },
+ { 0x258c, 0x19 },
+ { 0x258e, 0x16 },
+ { 0x2594, 0x0d },
+ { 0x2596, 0x0f },
+ { 0x2597, 0x09 },
+ { 0x2598, 0x0c },
+ { 0x259d, 0x0b },
+ { 0x25b6, 0x7f },
+ { 0x25c0, 0x7e },
+ { 0x25c6, 0x60 },
+ { 0x25cf, 0x14 },
+ { 0x25e2, 0x08 },
+ { 0x25e3, 0x0a },
+ { 0x2660, 0x7b },
+ { 0x2663, 0x10 },
+ { 0x2665, 0x00 },
+};
+
+wint_t wchar2ics[][2] = {
+ /* Unicode, ATASCII */
+ { 0x00a1, 0x60 },
+ { 0x00a3, 0x08 },
+ { 0x00c4, 0x7b },
+ { 0x00c9, 0x03 },
+ { 0x00d1, 0x02 },
+ { 0x00d6, 0x0c },
+ { 0x00dc, 0x10 },
+ { 0x00e0, 0x19 },
+ { 0x00e1, 0x00 },
+ { 0x00e2, 0x11 },
+ { 0x00e4, 0x0b },
+ { 0x00e7, 0x04 },
+ { 0x00e8, 0x15 },
+ { 0x00e9, 0x14 },
+ { 0x00ea, 0x17 },
+ { 0x00ec, 0x07 },
+ { 0x00ee, 0x13 },
+ { 0x00ef, 0x09 },
+ { 0x00f1, 0x16 },
+ { 0x00f2, 0x06 },
+ { 0x00f3, 0x0e },
+ { 0x00f4, 0x05 },
+ { 0x00f6, 0x0f },
+ { 0x00f9, 0x01 },
+ { 0x00fa, 0x0d },
+ { 0x00fb, 0x12 },
+ { 0x00fc, 0x0a },
+ { 0x0226, 0x1a },
+ { 0x0227, 0x18 },
+ { 0x2190, 0x1e },
+ { 0x2191, 0x1c },
+ { 0x2192, 0x1f },
+ { 0x2193, 0x1d },
+ { 0x21b0, 0x7d },
+ { 0x241b, 0x1b },
+ { 0x25b6, 0x7f },
+ { 0x25c0, 0x7e },
+};
+
+static int tblsize = sizeof(wchar2ata) / sizeof(wchar2ata[0]);
+
+static wint_t wsearch(wint_t table[][2], wint_t target, int start, int end) {
+ wint_t *elem;
+ int center;
+
+#ifdef WSEARCH_DEBUG
+ fprintf(stderr, "wsearch(0x%04x, %d, %d)\n", target, start, end);
+#endif
+
+ if(start == end) {
+ if(table[start][0] == target)
+ return table[start][1];
+ else
+ return -1;
+ } else {
+ center = (start + end) / 2;
+ elem = table[center];
+
+#ifdef WSEARCH_DEBUG
+ fprintf(stderr, "elem = 0x%04x, 0x%02x\n", elem[0], elem[1]);
+#endif
+
+ if(elem[0] == target)
+ return elem[1];
+ else if(elem[0] > target)
+ return wsearch(table, target, start, center);
+ else
+ return wsearch(table, target, center + 1, end);
+ }
+}
+
+int wchar2atascii(wint_t wc, int ics) {
+ return wsearch((ics ? wchar2ics : wchar2ata), wc, 0, tblsize - 1);
+}
+
+#ifdef WSEARCH_DEBUG
+int main(int argc, char **argv) {
+ printf("%02x\n", wchar2atascii(0x2190, 0));
+ printf("%02x\n", wchar2atascii(0x2571, 0));
+ printf("%02x\n", wchar2atascii(0x25c6, 0));
+ printf("%02x\n", wchar2atascii(0x2665, 0));
+ printf("%02x\n", wchar2atascii(0x2510, 0));
+ return 0;
+}
+#endif
diff --git a/wtable.h b/wtable.h
new file mode 100644
index 0000000..11c5fa2
--- /dev/null
+++ b/wtable.h
@@ -0,0 +1,2 @@
+extern wint_t wchar2ata[][2];
+extern int wchar2atascii(wint_t wc, int ics);
diff --git a/xex.5 b/xex.5
index 82774fe..0457418 100644
--- a/xex.5
+++ b/xex.5
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XEX" 5 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XEX" 5 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xex \- Atari 8-bit executable file format.
.\" RST source for xex(5) man page. Convert with:
@@ -298,25 +298,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/xex1to2.1 b/xex1to2.1
index 18ef638..06858b2 100644
--- a/xex1to2.1
+++ b/xex1to2.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XEX1TO2" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XEX1TO2" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xex1to2 \- Convert an Atari DOS 1.0 executable to a standard Atari executable
.\" RST source for xex1to2(1) man page. Convert with:
@@ -72,25 +72,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/xexamine.1 b/xexamine.1
index 381deb8..5bb1586 100644
--- a/xexamine.1
+++ b/xexamine.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XEXAMINE" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XEXAMINE" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xexamine \- Show information on Atari 8-bit executables (XEX)
.\" RST source for xexamine(1) man page. Convert with:
@@ -130,25 +130,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/xexcat.1 b/xexcat.1
index 0b6708b..c552867 100644
--- a/xexcat.1
+++ b/xexcat.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XEXCAT" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XEXCAT" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xexcat \- Concatenate Atari 8-bit executables (XEX) into a single XEX file.
.\" RST source for xexcat(1) man page. Convert with:
@@ -190,25 +190,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/xexsplit.1 b/xexsplit.1
index efe9ba0..6c78fc3 100644
--- a/xexsplit.1
+++ b/xexsplit.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XEXSPLIT" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XEXSPLIT" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xexsplit \- Split a multi-segment Atari 8-bit executable (XEX) into multiple single-segment files.
.\" RST source for xexsplit(1) man page. Convert with:
@@ -183,25 +183,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.
diff --git a/xfd2atr.1 b/xfd2atr.1
index 468361b..708144d 100644
--- a/xfd2atr.1
+++ b/xfd2atr.1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
-.TH "XFD2ATR" 1 "2024-05-03" "0.2.1" "Urchlay's Atari 8-bit Tools"
+.TH "XFD2ATR" 1 "2025-03-11" "0.2.2" "Urchlay's Atari 8-bit Tools"
.SH NAME
xfd2atr \- Convert an Atari 8-bit XFD (raw) disk image to an ATR image.
.\" RST source for xfd2atr(1) man page. Convert with:
@@ -111,25 +111,39 @@ Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\
.UNINDENT
.SH SEE ALSO
.sp
+\fBa8cat\fP(1),
\fBa8eol\fP(1),
-\fBa8utf8\fP(1),
+\fBa8xd\fP(1),
\fBatr2xfd\fP(1),
\fBatrsize\fP(1),
\fBaxe\fP(1),
+\fBbas2aplus\fP(1),
\fBblob2c\fP(1),
\fBblob2xex\fP(1),
\fBcart2xex\fP(1),
+\fBcxrefbas\fP(1),
\fBdasm2atasm\fP(1),
+\fBdiffbas\fP(1),
+\fBdumpbas\fP(1),
\fBf2toxex\fP(1),
\fBfenders\fP(1),
+\fBlistbas\fP(1),
+\fBlistamsb\fP(1),
+\fBprotbas\fP(1),
+\fBrenumbas\fP(1),
\fBrom2cart\fP(1),
\fBunmac65\fP(1),
+\fBunprotbas\fP(1),
+\fBvxrefbas\fP(1),
+\fBwhichbas\fP(1),
+\fBxex1to2\fP(1),
\fBxexamine\fP(1),
\fBxexcat\fP(1),
\fBxexsplit\fP(1),
\fBxfd2atr\fP(1),
\fBxex\fP(5),
-\fBatascii\fP(7).
+\fBatascii\fP(7),
+\fBfauxtari\fP(7).
.sp
Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference
Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc.