aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Watson <yalhcru@gmail.com>2019-03-13 02:50:42 -0400
committerB. Watson <yalhcru@gmail.com>2019-03-13 02:50:42 -0400
commit2973d0c78e9b8eed3c5af239927c6bd36af64604 (patch)
treea0fdfe7201303edd11c6d86015ef4f79796fcf0f /src
downloadfujichat-2973d0c78e9b8eed3c5af239927c6bd36af64604.tar.gz
initial commit
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog349
-rw-r--r--src/Makefile102
-rw-r--r--src/Makefile.include47
-rw-r--r--src/Makefile.webclient.ok50
-rw-r--r--src/about.c53
-rw-r--r--src/aexec.dasm206
-rw-r--r--src/aexec.h7
-rw-r--r--src/aextest.dasm52
-rw-r--r--src/aextest2.dasm27
-rw-r--r--src/atari850.serbin0 -> 88 bytes
-rwxr-xr-xsrc/atariserver.sh33
-rwxr-xr-xsrc/atariserver_slip.sh70
-rwxr-xr-xsrc/atariserver_slirp.sh48
-rw-r--r--src/bobvert.combin0 -> 1369 bytes
-rwxr-xr-xsrc/clear_rtsbin0 -> 11016 bytes
-rw-r--r--src/clear_rts.c42
-rw-r--r--src/clock-arch.c49
-rw-r--r--src/clock-arch.h41
-rw-r--r--src/col64/autorun.sysbin0 -> 1039 bytes
-rw-r--r--src/col64/col64.binbin0 -> 1039 bytes
-rw-r--r--src/col64/col64.dasm1194
-rw-r--r--src/col64/col64_ext.inc48
-rw-r--r--src/col64/cruft/col64.dasm1194
-rw-r--r--src/col64/cruft/col64.dasm.works731
-rw-r--r--src/col64/cruft/col64.sh6
-rw-r--r--src/col64/cruft/col64_ext.inc48
-rw-r--r--src/col64/cruft/col64font.bdf11993
-rw-r--r--src/col64/cruft/col64font.hex920
-rw-r--r--src/col64/cruft/col64font_almost.bdf11994
-rw-r--r--src/col64/cruft/col64font_ext.bdf11994
-rw-r--r--src/col64/cruft/col64font_ext.hex920
-rw-r--r--src/col64/cruft/col64font_new.bdf11994
-rw-r--r--src/col64/cruft/coltbl.pl17
-rw-r--r--src/col64/equates.inc1386
-rw-r--r--src/col64/font4x5.inc48
-rw-r--r--src/col64/test.atrbin0 -> 92176 bytes
-rw-r--r--src/col80_modified/Makefile15
-rw-r--r--src/col80_modified/autorun.sysbin0 -> 1152 bytes
-rw-r--r--src/col80_modified/col80_hacked.dasm906
-rw-r--r--src/col80_modified/col80_hacked.xexbin0 -> 1152 bytes
-rw-r--r--src/col80_modified/cruft/Makefile45
-rw-r--r--src/col80_modified/cruft/README.txt89
-rw-r--r--src/col80_modified/cruft/autorun.sysbin0 -> 1095 bytes
-rw-r--r--src/col80_modified/cruft/col80.atasm6
-rw-r--r--src/col80_modified/cruft/col80.dasm10
-rw-r--r--src/col80_modified/cruft/col80.info152
-rw-r--r--src/col80_modified/cruft/col80.s21
-rw-r--r--src/col80_modified/cruft/col80.xexbin0 -> 1163 bytes
-rw-r--r--src/col80_modified/cruft/col80_cc65_hack.cfg41
-rw-r--r--src/col80_modified/cruft/col80_dosini_seg.s12
-rw-r--r--src/col80_modified/cruft/col80_entry.s61
-rw-r--r--src/col80_modified/cruft/col80_header_seg.s6
-rw-r--r--src/col80_modified/cruft/col80_include.s50
-rw-r--r--src/col80_modified/cruft/col80_init.s35
-rw-r--r--src/col80_modified/cruft/col80_main.s824
-rw-r--r--src/col80_modified/cruft/col80_main.s.orig895
-rw-r--r--src/col80_modified/cruft/col80_main.xexbin0 -> 1047 bytes
-rw-r--r--src/col80_modified/cruft/col80_orig.xexbin0 -> 1429 bytes
-rw-r--r--src/col80_modified/cruft/col80_runad_seg.s13
-rw-r--r--src/col80_modified/cruft/col80_startaddr.s7
-rw-r--r--src/col80_modified/cruft/col80_startup.s4
-rwxr-xr-xsrc/col80_modified/cruft/dasm2atasm362
-rwxr-xr-xsrc/col80_modified/cruft/dos_20s.atrbin0 -> 92176 bytes
-rw-r--r--src/col80_modified/cruft/font.binbin0 -> 384 bytes
-rw-r--r--src/col80_modified/cruft/font.s54
-rw-r--r--src/col80_modified/cruft/font2xbm.pl47
-rw-r--r--src/col80_modified/cruft/new_font.s48
-rw-r--r--src/col80_modified/cruft/new_font.xbm35
-rwxr-xr-xsrc/col80_modified/cruft/test.atrbin0 -> 92176 bytes
-rw-r--r--src/col80_modified/cruft/xbm2font.pl29
-rwxr-xr-xsrc/col80_modified/dos_20s.atrbin0 -> 92176 bytes
-rw-r--r--src/col80_modified/font2xbm.pl48
-rw-r--r--src/col80_modified/icet.xbm43
-rw-r--r--src/col80_modified/icet_packed.fntbin0 -> 512 bytes
-rwxr-xr-xsrc/col80_modified/icet_to_col80bin0 -> 8996 bytes
-rw-r--r--src/col80_modified/icet_to_col80.c26
-rw-r--r--src/col80_modified/icet_vt.fntbin0 -> 1024 bytes
-rw-r--r--src/col80_modified/icetmod.rawbin0 -> 384 bytes
-rw-r--r--src/col80_modified/icetmod.s48
-rw-r--r--src/col80_modified/icetmod.xbm35
-rw-r--r--src/col80_modified/icetmod_maybe.xbm35
-rw-r--r--src/col80_modified/icetmod_old.xbm35
-rw-r--r--src/col80_modified/lsr.pl29
-rw-r--r--src/col80_modified/new_font.s48
-rw-r--r--src/col80_modified/t.dasm3
-rwxr-xr-xsrc/col80_modified/test.atrbin0 -> 92176 bytes
-rw-r--r--src/col80_modified/xbm2font.pl29
-rw-r--r--src/commands.c206
-rw-r--r--src/common.c255
-rw-r--r--src/common.h27
-rw-r--r--src/dns.c130
-rw-r--r--src/dos25_4drives.atrbin0 -> 92176 bytes
-rw-r--r--src/dos_20s.atrbin0 -> 92176 bytes
-rw-r--r--src/env.sh10
-rw-r--r--src/equates.inc1386
-rw-r--r--src/features.h102
-rw-r--r--src/fuji6432.atrbin0 -> 92176 bytes
-rw-r--r--src/fuji80.atrbin0 -> 92176 bytes
-rw-r--r--src/fuji_asm.s3016
-rw-r--r--src/fujichat-0.1.atrbin0 -> 92176 bytes
-rw-r--r--src/fujichat-0.3.atrbin0 -> 92176 bytes
-rw-r--r--src/fujichat.atrbin0 -> 92176 bytes
-rw-r--r--src/fujichat.atr.okbin0 -> 92176 bytes
-rw-r--r--src/fujichat.c1054
-rw-r--r--src/fujichat.cfgbin0 -> 173 bytes
-rw-r--r--src/fujichat.h136
-rw-r--r--src/fujiconf.c359
-rw-r--r--src/fujimenu.c90
-rw-r--r--src/fujiput.s21
-rw-r--r--src/fujitest.atrbin0 -> 92176 bytes
-rw-r--r--src/getsmess.c66
-rw-r--r--src/hex2inc.pl31
-rw-r--r--src/irc_notes95
-rw-r--r--src/keybuf.h26
-rw-r--r--src/keybuf.s94
-rw-r--r--src/keybuftest.c51
-rw-r--r--src/loadchat.dasm54
-rw-r--r--src/loadmenu.dasm69
-rw-r--r--src/loadmkau.dasm69
-rw-r--r--src/loadtest.c12
-rw-r--r--src/logcomptest.pl229
-rw-r--r--src/logtest.c53
-rw-r--r--src/main.c1184
-rw-r--r--src/makeauto.c177
-rw-r--r--src/mkdisk.sh48
-rw-r--r--src/mkfuji64.sh4
-rw-r--r--src/mkfuji80.sh4
-rw-r--r--src/new_format_ip.s54
-rw-r--r--src/notes.64x34176
-rw-r--r--src/prconn.serbin0 -> 94 bytes
-rw-r--r--src/put.c12
-rw-r--r--src/rs232dev.c299
-rw-r--r--src/rs232dev.h54
-rw-r--r--src/rvert.combin0 -> 1369 bytes
-rw-r--r--src/slattach_rts.diff26
-rw-r--r--src/slirp_debug2
-rw-r--r--src/start_getty.sh19
-rwxr-xr-xsrc/start_slip.sh56
-rw-r--r--src/start_slirp.sh29
-rw-r--r--src/test.atrbin0 -> 92176 bytes
-rw-r--r--src/testip.c10
-rw-r--r--src/uip-conf.h180
-rw-r--r--src/uip_arch.h0
-rw-r--r--src/uip_asm_output.s5253
144 files changed, 75037 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
new file mode 100644
index 0000000..6b95059
--- /dev/null
+++ b/src/ChangeLog
@@ -0,0 +1,349 @@
+- 20190313 bkw:
+
+FujiChat is back!
+
+The source is now developed using git, meaning you'll find low-level
+details about changes in the git log. I'll try to remember to update
+this ChangeLog to document major new features and such.
+
+- 20081201 bkw:
+
+Rewrote & reorganized handle_command(). It now lives in commands.c,
+and loops over a table of commands (cmd_list), rather than the old
+messy chain of if/else/if. Moved all the logic for each command into
+their own cmd_whatever() functions (the addresses of which are in the
+table). Not only did this save a couple hundred bytes of object code,
+it also means adding new commands is less expensive.
+
+Instead of telnet_send(tstate, serv_msg_buf, strlen(serv_msg_buf)) strewn
+about the code, there's now a send_serv_msg_buf(void) function. Rather
+than use strlen() to calculate, we set the new serv_msg_buf_len variable
+to the length... which works out great as almost all the telnet_send()
+instances were preceded by a sprintf(), which already returns the length
+(was just throwing away the return value! Old habits...)
+
+Added /fgcolor and /bgcolor commands (enable with FEAT_COLOR_COMMAND).
+These don't change the colors in the config, and they get reset before
+every new IRC connection, but it does mean you don't have to reload the
+config menu to try out new colors. Especially important for COL80 users,
+since it takes some fiddling to find a color set that looks good on your
+monitor (if you can!)
+
+Completely removed all attempts to do a software cursor when
+FEAT_COL80_HACK is enabled. It wasn't working anyway, and needs further
+thought before hacking away at it any more (should the COL80 driver
+respond to CRSINH at 752, like the real E: does?)... Actually it's
+perfectly usable without the cursor anyway, you always know where you
+are because you're always at the bottom of the screen. When/if arrow
+key editing is supported, there will have to be a cursor...
+
+
+- 20081130 bkw:
+
+More major surgery: there's now a hacked-up, cut-down version of the
+old COL80 driver, and Fujichat support for it. FEAT_COL80_HACK, which
+defines its own set of features. Currently the code is a mess of #ifdefs,
+but working (still some issues with the cursor not working right in 80
+cols). The 4x8 font is a slightly modified version of Itay Chamiel's
+Ice-T font (characters 32-127 only, I made the ampersand and the capital
+N look more like I expect them to). Current version of col80 uses the
+cassette buffer for a private input buffer for CIO get calls, but
+it could just as well use input_buf (though it can't know where that
+is, unless FEAT_LOW_RAM_BUFFERS is also enabled). So far, COL80 hack
+only tested with Bob-verter. Scroll speed is slower than Ice-T or
+E80/ACE80, but TCP has those pauses built into it... someone needs
+to try it at 9600 baud. An interesting thing about COL80 is that
+it's not limited to 128-char fonts (neither is Ice-T, Itay does a
+full 256-char set)... unicode anyone? SW underlining?
+
+Got rid of redraw_buf (was at $2800), calling fuji_putchar() in a loop
+is about as fast as fputs() a whole string. Allows user an extra page
+in low memory, unless I find a burning need to use it for something
+else...
+
+- 20081127 bkw:
+
+Expunged putchar() and cgetc(), from fujichat.c, gained over 200 bytes
+(replaced with "indirect JSR" technique using put/get address-minus-one
+in OS ROM). BSS now ends at $9515. We almost have enough room for an
+80-column software driver (the stack is 2K, so MEMTOP needs to be $9d15
+or higher since we don't use the heap). Default GR.0 setup, MEMTOP
+is $bc1f, which is where the stack starts (and grows downward for 2K,
+ending at $b41f). $B41F minus $9515 is 7946 bytes, almost 8K. In GR.8
+mode, MEMTOP is $A04F. Subtract $9515 (end of BSS), add 2K ($9D15,
+end of stack). Subtract from $A04F and we get $33a, or 826 bytes. This
+is not enough room for a GR.8 software 80-column driver's code + font
+(COL80E uses more like twice that), but it's a whole lot closer than
+FujiChat 0.4 was.
+
+Strip leading colons from the text of server messages.
+
+BSS at $977E (got rid of cursor() and replaced cgetc() with version
+that doesn't contain setcursor junk (we don't want to ever disable
+the cursor). In fact conio.h is gone now.
+
+Expunged fread() from common.c (replaced with read()), gained over
+1/2K.
+
+Made TCP listen support optional in uIP, and turned it off for
+FujiChat. This save about 1200 bytes in the binary.
+
+Starting to rewrite bits in asm. I've got the end of the BSS
+down to $97ED now, and I've barely started...
+
+Fixed bug in config_is_valid() that made fujichat always use
+built-in defaults. Thanks to Beetle for spotting this.
+
+- 20081126 bkw:
+
+Renamed menu.com to fujimenu.com (apparently on SpartaDOS X,
+trying to load D:MENU.COM ends up loading CAR:MENU.COM instead).
+Thanks to Beetle for spotting this.
+
+makeauto.com now cats the serial driver and loadmenu.com (instead
+of menu.com) to make autorun.sys. Saves like 70 sectors on the
+disk image.
+
+Added some test code (FEAT_UNICODE_TEST) that converts an input ctrl-P
+(clubs symbol) into the UTF-8 sequence for a Unicode "card suit clubs"
+symbol. It looked fine in irssi with univga font, but for some reason 3
+other people saw it as a spades symbol... Eventually it'd be possible to
+have a little table to convert all the ATASCII graphics chars into UTF-8
+on keyboard input, and convert the UTF-8 versions back into the ATASCII
+chars on screen output. Thanks to Redb3ard for coming up with the idea
+and doing the research on this... though it can't be fully implemented
+any time soon (FujiChat needs to go on a major diet before I add any
+more features, I'm running out of RAM).
+
+
+- 20081125 bkw:
+
+Added keyboard buffer. Needs lots of testing, but initially appears
+to work OK (FEAT_KEYBOARD_BUFFER)
+
+Added autojoin to fujichat.
+
+Rearranging things. The Atari 850 driver *crashes* if it's loaded
+from the DOS menu even (it *has* to be autorun.sys), so instead
+of the default.ser and such, the RS232 driver + menu now get
+catted together to create an autorun.sys (and the user is asked
+to reboot, to load it).
+
+Added auto-away on attract mode
+
+Added alt_nick and timezone fields to cfg file (not used yet),
+bumped CONF_VERSION.
+
+Rearrange fujichat numeric server message stuff, add autojoin capability.
+Also add autojoin prompt to fujiconf.
+
+Change the leading character for local message from * to > (e.g.
+"> Registering Nick"), and privmsgs to us now show up as
+"-> <nick> message"
+
+- 20081120 bkw:
+
+Fixed bug in conf menu (IRC server was getting reset to the first in the
+list if the user hit Return, instead of keeping his existing one). Thanks
+to Slor for spotting this.
+
+Added (attempted) 19200 baud support. cc65 doesn't define RS_BAUD_19200 in
+rs232.h. Slor suggested defining it as 0x0f (since the baud rate constants
+run 0x00 to 0x0e). It almost works: FujiChat is able to send & receive,
+but even with hardware handshaking, it can't keep up (lots of incoming
+packets get dropped, and the connection eventually stalls). Since Slor's
+HW handshaking is known to work (he can do 9600 baud reliably, and runs
+unpatched slattach without -L), I assume the trouble is that the loop
+in rs232dev.c is too slow. Recoding it in asm may help. It may have to
+use SIO instead of CIO though... or would that make it HW-specific?
+Guess it would.
+
+Added (bloated implementation of) ping time calculation. In the ping
+request, we send the contents of the 3 bytes of RTCLOK, and when we get
+them back, we subtract them from the current RTCLOK value and format
+as number of seconds + 10ths of seconds. Code uses CLOCKS_PER_SECOND,
+which means it auto-adjusts for PAL vs. NTSC timing. If RTCLOK rolled over
+between request & response, it'll appear to be a huge negative number...
+but I think uIP fails when RTCLOK rolls over anyway. Most people won't
+leave their Atari up for 3+ days anyway I guess.
+
+Clean up the raw IRC protocol server messages. We now strip the server
+hostname, parse numerics, and (for a few numerics) print meaningful
+message like "Topic". This could use a lot more work, but it does save
+our limited screen space.
+
+Implemented UIFLAG_HIDE_MOTD in fujichat.c. The traffic indicator still
+appears, to let the user know something's going on. Initial pre-MOTD
+server messages are not suppressed.
+
+- 20081119 bkw:
+
+*Major* surgery! The patient's vitals are strong, and the operation
+is a tentative success.
+
+fujichat's config menu has been split off into a separate executable.
+This keeps the menu from sitting around taking up memory while we're
+actually chatting. Also it paves the way for a fancier config menu with
+more options and a nice UI.
+
+While I was at it, I added a top-level menu program and an "about"
+option, with a separate viewer program that's a simple version of "more"
+from UNIX.
+
+All the programs (fujichat, fujiconf, menu) are able to load & run
+each other thanks to aexec (aka atari_exec()). This is a teensy little
+binary-file loader that fits into page 6, and gets prepended to
+all the other programs.
+
+Also, the Bob-verter driver is no longer baked into fujichat. Instead,
+we've got a tiny little loader called "loadchat", which does this:
+
+- Check for the existence of an R: device in HATABS
+- If not found, load the file DEFAULT.SER (ignoring "file not found")
+- Load fujichat.com
+
+DEFAULT.SER is just a binary load file. By default it'll be a copy
+of Bob-verter (also there's a copy called BOBVERT.SER).
+
+The config menu (fujiconf) allows the user to choose which serial
+device he has (by user-friendly name), and copies the appropriate
+driver (named something.SER) to DEFAULT.SER. Nota bene:
+
+- The driver is only loaded when the user chooses to run FujiChat
+itself, from either menu.com or fujiconf.com
+
+- If the driver setting gets changed before any R: driver is loaded,
+loadchat will load the new driver.
+
+- The menu allows the user to type a filename, to use a driver not
+in the built-in list (which is good as it's not a very complete
+list yet)
+
+- The menu also allows "none" as a choice, meaning he's taking
+responsibility for providing an R: handler himself (e.g. as an
+AUTORUN.SYS, or loaded from a SpartaDOS batch file or whatever).
+In this case, DEFAULT.SER will be deleted, and loadchat will
+silently fail to load it, and then FujiChat will just use the
+preloaded R: handler (or if it's missing, it'll give an error
+and let the user go back & reconfigure).
+
+- The way this is set up, it means the user can just use fujichat.com
+as a standalone executable, without the presence of menu.com, loadchat.com,
+fijuconf.com, or any other stuff from the disk. He can prepend his
+R: handler to it and load it from anywhere. It'll use the default
+config, but that's OK (most people would set up their SLIP host
+with the defaults anyway). He'll have to enter his server every
+time, and use /nick, but the program will *work*.
+
+- It's also possible to run fujiconf once to create a config file, then
+copy fujichat.com and fujichat.cfg to some other disk or directory
+or whatever, and run it without having the menu/loadchat/fujiconf/etc.
+The only missing capability is that he can't create a new config file.
+
+- The de luxe option: it should be fully possible to copy the contents
+of the FujiChat floppy image to a MyDOS or SpartaDOS subdirectory
+(obviously don't copy autorun.sys, dos.sys, dup.sys). All the filenames
+used by the program begin with D:, not D1:, so they should use the
+current drive and directory. (Eventually I'll write an INSTALL.COM
+that makes the directory & copies the stuff for you!)
+
+Other changes:
+
+Break key is now disabled. No more accidentally sending a line when
+you meant to hit Backspace.
+
+There's now a tiny AUTORUN.SYS that finishes the DOS boot stuff, then
+runs MENU.COM (the main menu) for us.
+
+MENU.COM, FUJICONF.COM, and FUJICHAT.COM all look in page 5 for the
+config, which stays resident when switching between programs. If it's
+not there, they all try to load it from FUJICHAT.CFG. If that fails,
+they use built-in defaults.
+
+FujiChat (FUJICHAT.COM) *can not* create FUJICHAT.CFG itself.
+
+Had to use memcpy() instead of Adam's uip_sethostaddr() and
+uip_setdraddr() macros (they have trouble when their arguments are
+dereferenced pointers; probably this is a deficiency in cc65).
+
+The config menu is a lot more user-friendly. It stops the user from
+setting unreadable colors (where fg/bg have equal luma values), and
+the long, long list of questions is broken up into sections.
+
+rs232dev_init() now returns a status. If it's not RS_ERR_OK, something
+went wrong. If this happens, FujiChat allows the user to retry,
+run fujiconf, or exit to DOS.
+
+I won't be providing single-file .xex downloads any more. The ATR image
+will be the main distribution (possibly I'll also offer the contents
+in a zip file, for S-Drive or MyIDE users). The main executable still
+works standalone, but is not fully functional, so I'd rather discourage
+'noobs' from running it that way (non-noobs know how to extract the
+.xex from the .atr image themselves).
+
+Changed uip-conf.h, now uIP is compiled with support for only one
+TCP conn, one UDP conn, and one TCP listen port (TCP listen support
+isn't disable-able in uIP; I'll change that later). Also disabled
+UDP checksums.
+
+Added FEAT_* macros to remove some FujiChat features at compile time.
+See fujichat.c for the list of features and how much code space they
+take up.
+
+Added network traffic indicator in upper right corner of screen:
+up arrow for transmit, down arrow for receive. FEAT_TRAFFIC_INDICATOR
+
+/j or /join with no argument now tries to rejoin the current channel
+(use if you get kicked). Also, fixed bug where /j with no argument
+tried to join a bogus (null) channel.
+
+/nick now tracks your nick changes. This fixes the bug where, after
+a nick change, private messages to your new nick appear to be
+channel traffic.
+
+
+- 20081116 bkw:
+Fixed bug in 0.3.0 (ctcp responses didn't work when a ctcp request came
+back in the middle of typing a line)
+Made baud rate selectable in the UI (there was already a config file entry
+for it)
+0.3.0 released
+Added ^W and ^U (delete last word, delete-line, emacs-style)
+Added simulated edit buffer using delete-line and cursor controls. This
+isn't as nice as a custom display list, but it stays compatible with (most)
+80-column drivers.
+Added option to run config menu from the "return to connect" prompt, got rid
+of "Use defaults [y/n]" prompt.
+Added support for selecting the server port (default still 6667)
+Added support for real name field
+We now close the serial port when disconnected (needed for the config menu
+to be able to save to disk, at least with bob-verter driver)
+
+- 20081115 bkw:
+Changed uIP packet buffer size to 576. This will help with those DNS aliases
+that return 15 hostnames + aliases (like irc.freenode.org). TCP MSS is still
+set to 160 - header_len, to keep it feeling like an interactive app.
+
+strcmp against config.nick changed to strcasecmp, so we can correctly
+handle messages/ctcps to the lowercase (or whatever) version of our nick.
+
+Added option to enter an IRC server instead of just "press return
+to connect". The default is the config file server, or last server
+connected to.
+
+- 20081113 bkw:
+0.2 released
+Added option to exit to DOS
+FujiChat now works with FreeNode (mostly)
+Made local/peer/DNS IP configurable
+Server hostname now configurable
+UI flags configurable: visual bell, no bell, msg bell, show ping
+Default server list is now hostnames
+Consolidate some UI I/O code
+Initial support for DNS resolution
+
+- 20081112 bkw:
+Added visual bell support
+Added ` (backtick) support (prints as inverse single quote)
+
+- 20081105: 0.1 released
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..a942af8
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,102 @@
+# Copyright (c) 2001, Adam Dunkels.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote
+# products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# This file is part of the uIP TCP/IP stack.
+#
+# $Id: Makefile,v 1.13 2006/06/11 21:55:03 adam Exp $
+#
+
+all: uip fujiconf.xex aexec.xex fujimenu.xex makeauto.xex about.xex loadmkau.xex loadmenu.xex keybuf.o clear_rts
+
+CC = cl65
+AR = ar65
+APPS = telnet resolv
+CFLAGS = -t atari -I../uip/uip -I. -O
+
+-include Makefile.include
+
+uip: $(addprefix $(OBJECTDIR)/, fujichat.o common.o commands.o rs232dev.o clock-arch.o) keybuf.o apps.a uip.a fujiput.s
+
+#fujichat.o: common.h features.h fujichat.h # no worky?
+
+keybuf.o: keybuf.s
+ ca65 -t atari -l -o keybuf.o keybuf.s
+
+common.o: common.c common.h
+ $(CC) $(CFLAGS) -c -o common.o common.c
+
+fujiconf.xex: fujiconf.c fujichat.h common.o
+ $(CC) $(CFLAGS) -o fujiconf.xex fujiconf.c common.o obj/uiplib.o
+
+fujimenu.xex: fujimenu.c fujichat.h aexec.xex common.o
+ $(CC) $(CFLAGS) -o fujimenu.xex fujimenu.c common.o
+
+about.xex: about.c fujichat.h aexec.xex common.o
+ $(CC) $(CFLAGS) -o about.xex about.c common.o
+
+#loadchat.xex: loadchat.c fujichat.h
+# $(CC) $(CFLAGS) -o loadchat.xex loadchat.c
+
+#loadchat.xex: loadchat.dasm
+#dasm loadchat.dasm -f3 -oloadchat.xex
+
+makeauto.xex: makeauto.c
+ $(CC) $(CFLAGS) -o makeauto.xex makeauto.c common.o
+
+loadmenu.xex: loadmenu.dasm
+ dasm loadmenu.dasm -f3 -oloadmenu.xex
+
+loadmkau.xex: loadmkau.dasm
+ dasm loadmkau.dasm -f3 -oloadmkau.xex
+
+aexec.xex: aexec.dasm
+ dasm aexec.dasm -f3 -oaexec.xex
+
+test: newdisk
+ atariserver fujitest.atr
+ sudo sh ./start_slip.sh
+
+disk: newdisk
+
+newdisk: all
+ sh mkdisk.sh
+
+old_disk: uip
+ cat rvert.com uip > autorun.sys
+ axe -w autorun.sys uiptest.atr
+ #xterm -e atariserver uiptest.atr
+
+clean:
+ rm -fr *.xex obj/ *.o *~ *core uip $(OBJECTDIR) *.a
+ mkdir obj
+
+keybuftest.xex: keybuftest.c keybuf.o
+ $(CC) $(CFLAGS) -o keybuftest.xex keybuftest.c keybuf.o
+
+# native, not Atari!
+clear_rts: clear_rts.c
+ cc -o clear_rts clear_rts.c
diff --git a/src/Makefile.include b/src/Makefile.include
new file mode 100644
index 0000000..05ce291
--- /dev/null
+++ b/src/Makefile.include
@@ -0,0 +1,47 @@
+
+
+ifdef APPS
+ APPDIRS = $(foreach APP, $(APPS), ../uip/apps/$(APP))
+ -include $(foreach APP, $(APPS), ../uip/apps/$(APP)/Makefile.$(APP))
+ CFLAGS += $(addprefix -I../uip/apps/,$(APPS))
+endif
+
+ifndef CCDEP
+ CCDEP = $(CC)
+endif
+ifndef CCDEPCFLAGS
+ CCDEPCFLAGS = $(CFLAGS)
+endif
+ifndef OBJECTDIR
+ OBJECTDIR = obj
+endif
+
+ifeq (${wildcard $(OBJECTDIR)},)
+ DUMMY := ${shell mkdir $(OBJECTDIR)}
+endif
+
+
+vpath %.c . ../uip/uip ../uip/lib $(APPDIRS)
+
+$(OBJECTDIR)/%.o: %.c
+ $(CC) $(CFLAGS) -o $@ -c $<
+
+$(OBJECTDIR)/%.d: %.c
+ @set -e; rm -f $@; \
+ $(CCDEP) -MM $(CCDEPCFLAGS) $< > $@.$$$$; \
+ sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \
+ rm -f $@.$$$$
+
+UIP_SOURCES=uip.c uip_arp.c uiplib.c psock.c timer.c uip-neighbor.c
+
+
+ifneq ($(MAKECMDGOALS),clean)
+-include $(addprefix $(OBJECTDIR)/,$(UIP_SOURCES:.c=.d) \
+ $(APP_SOURCES:.c=.d))
+endif
+
+uip.a: ${addprefix $(OBJECTDIR)/, $(UIP_SOURCES:.c=.o)}
+ $(AR) a $@ $^
+
+apps.a: ${addprefix $(OBJECTDIR)/, $(APP_SOURCES:.c=.o)}
+ $(AR) a $@ $^
diff --git a/src/Makefile.webclient.ok b/src/Makefile.webclient.ok
new file mode 100644
index 0000000..24f4746
--- /dev/null
+++ b/src/Makefile.webclient.ok
@@ -0,0 +1,50 @@
+# Copyright (c) 2001, Adam Dunkels.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote
+# products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# This file is part of the uIP TCP/IP stack.
+#
+# $Id: Makefile,v 1.13 2006/06/11 21:55:03 adam Exp $
+#
+
+all: uip
+
+CC = cl65
+AR = ar65
+APPS = webclient resolv
+CFLAGS = -t atari -I../uip -I. -O
+
+-include Makefile.include
+
+uip: $(addprefix $(OBJECTDIR)/, main.o rs232dev.o clock-arch.o) apps.a uip.a
+
+test: uip
+ cat rvert.com uip > autorun.sys
+ axe -w autorun.sys uiptest.atr
+ #xterm -e atariserver uiptest.atr
+
+clean:
+ rm -fr *.o *~ *core uip $(OBJECTDIR) *.a
diff --git a/src/about.c b/src/about.c
new file mode 100644
index 0000000..01d6fcb
--- /dev/null
+++ b/src/about.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include "fujichat.h"
+#include "common.h"
+
+/* TODO: rewrite in asm. This does NOT need to
+ be 7K of object code. */
+
+void more(char *file) {
+ char c, line = 0;
+ char buf[200];
+ FILE *f = fopen(file, "r");
+
+ putchar(0x7d);
+
+ if(!f) {
+ printf("%s not found\n", file);
+ cgetc();
+ return;
+ }
+
+ while(fgets(buf, 200, f)) {
+ if(*buf == '#') continue;
+
+ line += (strlen(buf) / 40 + 1);
+ if(line > 23) {
+ fputs("--more--", stdout);
+ fflush(stdout);
+
+ c = cgetc();
+ if(c == 27)
+ break;
+
+ putchar(A_DEL);
+ line = 0;
+ }
+
+ fputs(buf, stdout);
+ }
+
+ fclose(f);
+
+ fputs("--any key--", stdout);
+ fflush(stdout);
+
+ c = cgetc();
+}
+
+int main(int, char **) {
+ more("D:ABOUT.TXT");
+ atari_exec(MENU_FILENAME);
+}
diff --git a/src/aexec.dasm b/src/aexec.dasm
new file mode 100644
index 0000000..9338c4c
--- /dev/null
+++ b/src/aexec.dasm
@@ -0,0 +1,206 @@
+
+; Load an Atari DOS executable, including support for init and run vectors
+; Parameters: nul-terminated filename pointer in A/X (lo/hi)
+; Return value: 0 for success, nonzero on error, never returns if exe has
+; a run address.
+
+; TODO: learn ca65 syntax better, port this to ca65
+
+; Usage: build with "dasm aexec.dasm -f3 -oaexec.xex"
+; "Link" to your program with "cat aexec.xex yourprog.xex > newprog.xex"
+
+; int __fastcall__ (*atari_exec_p)(char *) = (int __fastcall__ (*)(char *))0x600;
+; #define atari_exec(x) ((*atari_exec_p)(x))
+; then call with: atari_exec("D:PROGRAM.XEX");
+
+; If the file can't be opened for whatever reason, atari_exec() returns a
+; nonzero result (the Atari error number).
+
+; If the file loads OK and has a run address, atari_exec() never returns
+; (runs the loaded program, then exits to DOS if/when the program exits).
+; This means there's no memory conflict between caller and callee.
+
+; If there was no run address, atari_exec returns 0 to the caller.
+; The caller is responsible for making sure the loaded program doesn't
+; step on the memory used by the caller or atari_exec itself!
+
+; If the file is openable but invalid (not a XEX, or truncated), current
+; atari_exec() implementation hangs the machine with a red screen, since
+; there's no way to know whether the partially-loaded program overwrote
+; the caller...
+
+
+ processor 6502
+ include "equates.inc"
+
+tmp = $d4 ; aka FR0
+loadaddr = $d6
+
+main = $0600
+
+ org main-6
+ word $FFFF
+ word main
+ word endmain-1
+
+ org main
+ pha
+ txa
+ pha
+ jsr fclose
+ pla
+ tax
+ pla
+
+ sta ICBAL+16
+ stx ICBAH+16
+ sta tmp
+ stx tmp+1
+ ldy #0
+
+; do an OPEN #1,4,0,$filename
+
+; get length of filename
+fnameloop:
+ lda (tmp),y
+ beq fndone
+ iny
+ bne fnameloop
+
+ ; set IOCB #1 buffer addr, buffer len, etc
+fndone:
+ sty ICBLL+$10
+ lda #0
+ sta ICBLH+$10
+ sta ICAX2+$10
+
+ ; init these to 0 so we can tell if they change
+ sta RUNAD
+ sta RUNAD+1
+ sta INITAD
+ sta INITAD+1
+
+ ldx #4
+ stx ICAX1+$10
+ dex
+ stx ICCOM+$10 ; cmd #3 = OPEN
+
+ ldx #$10
+ jsr CIOV ; do the OPEN
+ bpl readheader
+
+ tya ; CIO returns error code in Y reg
+ ldx #0
+ rts
+
+fail:
+ lda #$48
+ sta 710
+hang bne hang
+
+readheader:
+; read 2 bytes into local buffer
+ jsr read2bytes
+ bpl ok
+ cpy #136 ; EOF
+ bne fail
+ beq close_file ; if at EOF, close the file
+
+; if they're $ffff, try again
+ok:
+ lda tmp
+ tax
+ and tmp+1
+ cmp #$ff
+ beq readheader
+
+; store those 2 bytes in loadaddr
+ lda tmp+1
+ sta loadaddr+1
+ stx loadaddr
+
+; read 2 more bytes into local buffer (end addr)
+ jsr read2bytes
+ bmi fail
+; subtract loadaddr from end addr, add 1, to get length
+; store length into IOCB
+ lda loadaddr
+ sta ICBAL+$10
+ lda loadaddr+1
+ sta ICBAH+$10
+
+ sec
+ lda tmp
+ sbc loadaddr
+ sta ICBLL+$10
+ lda tmp+1
+ sbc loadaddr+1
+ sta ICBLH+$10
+ inc ICBLL+$10
+ bne noinc
+ inc ICBLH+$10
+noinc:
+ jsr read_segment
+ bmi fail
+
+; if INITAD modified, JSR there
+ lda INITAD
+ ora INITAD+1
+ beq readheader
+
+ jsr do_init
+
+ lda #0
+ sta INITAD
+ sta INITAD+1
+ beq readheader ; branch always
+
+do_init
+ jmp (INITAD)
+
+close_file:
+ jsr fclose
+
+; JSR through RUNAD if it's not zero
+ lda RUNAD
+ ora RUNAD+1
+ beq norun
+
+ jsr do_run
+ jmp (DOSVEC) ; does not return
+
+; If there was no run address, we were probably loading an R: driver, so
+; our caller is safe to return to
+norun
+ lda #0 ; return 0
+ tax
+ rts
+
+read2bytes:
+ lda #tmp
+ sta ICBAL+$10
+ lda #2
+ sta ICBLL+$10
+ lda #0
+ sta ICBAH+$10
+ sta ICBLH+$10
+read_segment:
+ lda #C_GETCHR
+ sta ICCOM+$10
+ ldx #$10
+ jmp CIOV
+
+do_run
+ jmp (RUNAD)
+
+fclose
+ lda #C_CLOSE
+ sta ICCOM+$10
+ ldx #$10
+ jmp CIOV
+
+endmain
+
+; word RUNAD
+; word RUNAD+1
+; word main
diff --git a/src/aexec.h b/src/aexec.h
new file mode 100644
index 0000000..41cc9fd
--- /dev/null
+++ b/src/aexec.h
@@ -0,0 +1,7 @@
+#ifndef AEXEC_H
+#define AEXEC_H
+
+extern int __fastcall__ (*atari_exec_p)(char *);
+#define atari_exec(x) ((*atari_exec_p)(x))
+
+#endif
diff --git a/src/aextest.dasm b/src/aextest.dasm
new file mode 100644
index 0000000..da4522b
--- /dev/null
+++ b/src/aextest.dasm
@@ -0,0 +1,52 @@
+
+ processor 6502
+ include equates.inc
+
+init_routine = $2E00
+
+ org init_routine-6
+ word $FFFF
+ word init_routine
+ word end_init_routine-1
+
+ org init_routine
+
+ lda #0
+ sta COLOR2
+
+ lda RTCLOK+2
+iloop:
+ cmp RTCLOK+2
+ beq iloop
+
+ rts
+
+end_init_routine:
+
+ word INITAD
+ word INITAD+1
+ word init_routine
+
+main_routine = $2F00
+ rorg main_routine-6
+ word main_routine
+ word end_main_routine-1
+
+ rorg main_routine
+
+ lda #$0F
+ sta COLOR2
+
+ lda RTCLOK+2
+mloop:
+ cmp RTCLOK+2
+ beq mloop
+
+ rts
+
+end_main_routine:
+
+ word RUNAD
+ word RUNAD+1
+ word main_routine
+
diff --git a/src/aextest2.dasm b/src/aextest2.dasm
new file mode 100644
index 0000000..fa897c6
--- /dev/null
+++ b/src/aextest2.dasm
@@ -0,0 +1,27 @@
+
+ processor 6502
+ include equates.inc
+
+main = $6000
+
+ org main-6
+ word $FFFF
+ word main
+ word end_main-1
+
+ org main
+
+ lda #<filename
+ ldx #>filename
+ jsr $0600
+ lda #$08
+ sta COLOR2
+ rts
+
+filename: byte "D:AEXTEST.XEX", $00
+
+end_main:
+
+ word RUNAD
+ word RUNAD+1
+ word main
diff --git a/src/atari850.ser b/src/atari850.ser
new file mode 100644
index 0000000..57eee3f
--- /dev/null
+++ b/src/atari850.ser
Binary files differ
diff --git a/src/atariserver.sh b/src/atariserver.sh
new file mode 100755
index 0000000..5a1d838
--- /dev/null
+++ b/src/atariserver.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+# Configurable stuff:
+
+# Name of the disk image (default: command line arg, or fujichat.atr)
+ATR_IMAGE=${1-fujichat.atr}
+
+TTY=/dev/ttyS0 # serial port to use
+
+# No delay:
+#DELAY="true"
+
+# 1 second:
+#DELAY="sleep 1"
+
+# 1/4 second (may not work on old Linux installs):
+DELAY="usleep 250000"
+
+# End of config section, start of code:
+
+ifconfig $SLIP_IFACE down 2&>/dev/null
+killall $SLATTACH 2&>/dev/null
+fuser -k $TTY 2&>/dev/null # make sure nobody's using the port...
+$DELAY
+fuser -k -9 $TTY 2&>/dev/null # Just in case...
+$DELAY
+modprobe atarisio port=$TTY
+$DELAY
+atariserver $ATR_IMAGE
+#atariserver autorun.sys # fails when run from MyPicoDOS, why?
+$DELAY
+rmmod atarisio
+$DELAY
diff --git a/src/atariserver_slip.sh b/src/atariserver_slip.sh
new file mode 100755
index 0000000..42b37cd
--- /dev/null
+++ b/src/atariserver_slip.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+# This script is for use with the uIP test programs and AtariSIO.
+# Before running this, run "make disk" to create the disk image.
+# This script needs to be run with root privileges (e.g. with sudo)
+
+# Configurable stuff:
+
+ATR_IMAGE=${1-fujichat.atr}
+
+#ATR_IMAGE=fujitest.atr # Name of the disk image
+TTY=/dev/ttyS0 # serial port to use
+BAUD=4800 # must match compiled-in value in rs232dev.c
+SLATTACH=a8_slattach # slattach binary (possibly patched)
+SLIP_IFACE=sl0 # probably no need to change this
+LOCAL_IP=192.168.0.1 # SLIP IP address for Linux host
+REMOTE_IP=192.168.0.2 # SLIP IP address for Atari host
+IP_FORWARD=yes # Route packets for the Atari?
+IP_MASQUERADE=yes # NAT for the Atari?
+MASQ_IFACE=ra0 # if NATing, our main (LAM or internet) interface
+DUMP_PACKETS=yes # Run tcpdump on sl0 interface?
+
+# DELAY is needed on some (most?) systems because e.g. atariserver tries
+# to run before the atarisio module is fully initialized. Choose one:
+
+# No delay:
+#DELAY="true"
+
+# 1 second:
+#DELAY="sleep 1"
+
+# 1/4 second (may not work on old Linux installs):
+DELAY="usleep 250000"
+
+# End of config section, start of code:
+
+ifconfig $SLIP_IFACE down 2&>/dev/null
+killall $SLATTACH 2&>/dev/null
+fuser -k $TTY 2&>/dev/null # make sure nobody's using the port...
+$DELAY
+fuser -k -9 $TTY 2&>/dev/null # Just in case...
+$DELAY
+modprobe atarisio port=$TTY
+$DELAY
+atariserver $ATR_IMAGE
+#atariserver autorun.sys # fails when run from MyPicoDOS, why?
+$DELAY
+rmmod atarisio
+$DELAY
+echo "Starting SLIP on $SLIP_IFACE, local $LOCAL_IP, remote $REMOTE_IP"
+$SLATTACH -L -p slip -s $BAUD $TTY &
+$DELAY
+ifconfig $SLIP_IFACE $LOCAL_IP mtu 576
+ifconfig $SLIP_IFACE $LOCAL_IP pointopoint $REMOTE_IP
+
+if [ "$IP_MASQUERADE" = "yes" ]; then
+ echo "IP Masquerading enabled"
+ iptables -F
+ iptables -t nat -F
+ iptables -t nat -A POSTROUTING -o $MASQ_IFACE -j MASQUERADE
+fi
+
+if [ "$IP_FORWARD" = "yes" ]; then
+ echo "IP Forwarding enabled"
+ echo "1" > /proc/sys/net/ipv4/ip_forward
+fi
+
+if [ "$DUMP_PACKETS" = "yes" ]; then
+ tcpdump -i $SLIP_IFACE -X -n -vvv -s 0
+fi
diff --git a/src/atariserver_slirp.sh b/src/atariserver_slirp.sh
new file mode 100755
index 0000000..c6ba620
--- /dev/null
+++ b/src/atariserver_slirp.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+# Configurable stuff:
+
+# Name of the disk image (default: command line arg, or fujichat.atr)
+ATR_IMAGE=${1-fujichat.atr}
+
+TTY=/dev/ttyS0 # serial port to use
+BAUD=4800 # must match FujiChat conf
+
+# This setting is only needed if you're using an AtariMax (Steve Tucker)
+# auto-sensing SIO2PC as your serial device.
+TUCKER_SIO2PC_HACK="yes"
+
+# DELAY is needed on some (most?) systems because e.g. atariserver tries
+# to run before the atarisio module is fully initialized. Choose one:
+
+# No delay:
+#DELAY="true"
+
+# 1 second:
+#DELAY="sleep 1"
+
+# 1/4 second (may not work on old Linux installs):
+DELAY="usleep 250000"
+
+# End of config section, start of code:
+
+ifconfig $SLIP_IFACE down 2&>/dev/null
+killall $SLATTACH 2&>/dev/null
+fuser -k $TTY 2&>/dev/null # make sure nobody's using the port...
+$DELAY
+fuser -k -9 $TTY 2&>/dev/null # Just in case...
+$DELAY
+modprobe atarisio port=$TTY
+$DELAY
+atariserver $ATR_IMAGE
+#atariserver autorun.sys # fails when run from MyPicoDOS, why?
+$DELAY
+rmmod atarisio
+$DELAY
+
+slirp "tty $TTY" "mru 576" "mtu 576" "baudrate $BAUD" &
+
+if [ "$TUCKER_SIO2PC_HACK" = "yes" ]; then
+ sleep 1
+ ./clear_rts
+fi
diff --git a/src/bobvert.com b/src/bobvert.com
new file mode 100644
index 0000000..b5aeccc
--- /dev/null
+++ b/src/bobvert.com
Binary files differ
diff --git a/src/clear_rts b/src/clear_rts
new file mode 100755
index 0000000..e855ca0
--- /dev/null
+++ b/src/clear_rts
Binary files differ
diff --git a/src/clear_rts.c b/src/clear_rts.c
new file mode 100644
index 0000000..52da3f5
--- /dev/null
+++ b/src/clear_rts.c
@@ -0,0 +1,42 @@
+/* Compile with:
+ gcc -o toggle_rts toggle_rts.c
+
+ Change PORT if necessary.
+ */
+#define PORT "/dev/ttyS0"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <linux/serial.h>
+
+int main() {
+ int fd, status;
+
+ fd = open(PORT, O_RDWR);
+ if(fd < 0) {
+ perror(PORT);
+ return 1;
+ }
+
+ // fprintf(stderr, "ioctl(fd, TIOCMGET, &status);\n");
+ ioctl(fd, TIOCMGET, &status);
+ /*
+ if(status & TIOCM_RTS) {
+ fprintf(stderr, "RTS set\n");
+ } else {
+ fprintf(stderr, "RTS clear\n");
+ }
+ */
+ status &= ~TIOCM_RTS;
+ ioctl(fd, TIOCMSET, &status);
+ // fprintf(stderr, "ioctl(fd, TIOCMSET, &status);\n");
+ fprintf(stderr, "RTS forced off (Tucker SIO2PC)\n");
+ return 0;
+}
diff --git a/src/clock-arch.c b/src/clock-arch.c
new file mode 100644
index 0000000..8cff850
--- /dev/null
+++ b/src/clock-arch.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $
+ */
+
+/**
+ * \file
+ * Implementation of architecture-specific clock functionality
+ * \author
+ * Adam Dunkels <adam@sics.se>
+ */
+
+#include "clock-arch.h"
+
+/*---------------------------------------------------------------------------*/
+clock_time_t
+clock_time(void)
+{
+ return clock();
+}
+/*---------------------------------------------------------------------------*/
diff --git a/src/clock-arch.h b/src/clock-arch.h
new file mode 100644
index 0000000..8ea4edc
--- /dev/null
+++ b/src/clock-arch.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2006, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $
+ */
+
+#ifndef __CLOCK_ARCH_H__
+#define __CLOCK_ARCH_H__
+
+#include <time.h>
+typedef int clock_time_t;
+#define CLOCK_CONF_SECOND (_clocks_per_sec())
+
+#endif /* __CLOCK_ARCH_H__ */
diff --git a/src/col64/autorun.sys b/src/col64/autorun.sys
new file mode 100644
index 0000000..956e404
--- /dev/null
+++ b/src/col64/autorun.sys
Binary files differ
diff --git a/src/col64/col64.bin b/src/col64/col64.bin
new file mode 100644
index 0000000..956e404
--- /dev/null
+++ b/src/col64/col64.bin
Binary files differ
diff --git a/src/col64/col64.dasm b/src/col64/col64.dasm
new file mode 100644
index 0000000..aca1259
--- /dev/null
+++ b/src/col64/col64.dasm
@@ -0,0 +1,1194 @@
+
+; ----------------------------------------------------------------------------
+; 64x32 software text driver
+; Uses 4x5 font in 5x6 character cells
+; Based on disassembled COL80 driver
+
+; This driver is missing quite a few things a full E: driver should have:
+
+; - Does not work with BASIC or any other cart! Though if START_ADDRESS_1
+; is changed to $7Cxx, a BASIC-able version could be assembled
+
+; - No support for cursor controls, insert/delete, or even clear screen
+; (instead the control-codes are printed as normal characters, if they're
+; above 31 decimal). This is a feature: our intended application is an
+; IRC client, where ASCII codes 125 and 126 represent } and ~ chars,
+; not clear-screen and backspace.
+
+; - Backspace key is supported during get-byte, but printing a backspace
+; with put-byte prints a tilde instead. Again, a feature.
+
+; - No support for low ASCII at all: any attempt to input or print a character
+; in the range 0-31 decimal is just ignored (this includes the arrow keys).
+; This is done to keep the font size at 96 characters, so it'll fit in a
+; page. Also IRC doesn't use low-ASCII.
+
+; - Does not attempt to survive a warmstart
+
+; - Will fail disastrously if an application sets COLCRS/ROWCRS to any
+; out-of-range values
+
+; - Only displays the cursor during get-byte operations
+
+; On the other hand, this driver is tiny (font is 240 bytes, code 718, not
+; counting 100 bytes of throwaway init code in the tape buffer), and plays
+; nice with cc65's stdio support (though NOT conio, don't even go there)
+
+; Theory of operation:
+
+; This is an Atari OS-compliant device driver. On load, the init routine
+; replaces the E: entry in HATABS with a pointer to our vector table,
+; col64_vector_tab.
+
+; We implement the CIO commands OPEN, CLOSE, GETBYTE, and PUTBYTE. The
+; GET-STATUS and SPECIAL commands are not implemented, and the CLOSE
+; command simply returns success (it doesn't need to do anything else).
+
+; When a channel is OPENed to our new E: device, the col64_open routine
+; calls part of the OS's S: handler to switch to GRAPHICS 8 (320x192 mono)
+; mode.
+
+; When the CIO PUT-BYTES or PUT-RECORD calls are made on our channel, CIO
+; calls our PUTBYTE routine (col64_putbyte) as needed to write (print)
+; characters to the screen. col64_putbyte keeps track of the current
+; cursor position (using COLCRS and ROWCRS), and either renders a glyph
+; at the current location, or (when the EOL character $9B is printed)
+; moves the cursor to the beginning of the next line, scrolling the
+; display RAM if necessary.
+
+; When the CIO GET-BYTES or GET-RECORD calls are made on our channel, CIO
+; calls our GETBYTE routine (col64_getbyte). This routine maintains its
+; own buffer of user-input characters. When first called (or any call when
+; the buffer is empty), col64_getbyte reads a complete line of input using
+; the OS's K: handler, echoing typed characters to the screen using our
+; own col64_putbyte. Only the backspace key is supported for editing. Once
+; the user presses Return, the first byte in the buffer is returned to
+; the caller. On subsequent calls, characters are returned from the buffer
+; until the buffer is empty. At this point, the next call to col64_getbyte
+; will result in a new line of input being read.
+
+; col64_putbyte calls render_glyph to draw a character in display RAM.
+; The font consists of 96 characters (low ASCII not supported), each 4 pixels
+; wide and 5 tall [*]. These are rendered into 5x6 character cells, with the
+; extra pixels being left blank to provide padding between characters.
+; Since 5 pixel wide cells don't line up evenly on display RAM byte
+; boundaries, render_glyph has to shift each 4-pixel line of glyph
+; data the appropriate number of times, and combine the result with the
+; rest of each screen byte (that portion that's outside of the 5-pixel
+; cell we're currently writing to). Surprisingly, this is accomplished
+; slightly faster than the standard OS E: driver prints a single character.
+; (unfortunately, scrolling the screen is *much* slower than the OS E:
+; driver's scrolling...)
+
+; [*] ...except the lowercase q j p q y, which have true descenders. The
+; glyphs for these are still 4x5, but the 6th row of pixels for all 5
+; get stored together in the last glyph in the set (ASCII code $7F,
+; which should be considered an unprintable character).
+
+ processor 6502 ; DASM-specific
+
+; ----------------------------------------------------------------------------
+ include equates.inc
+
+; "backdoor" vectors into the S: and K: ROM drivers. These are addres-minus-1,
+; called by PHA/PHA/RTS.
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+
+; ----------------------------------------------------------------------------
+; Constants
+
+LAST_ROW = $1F ; last valid cursor row on screen, 31 decimal (we count from 0)
+EOL = $9B ; Atari ASCII end-of-line (aka the Return key)
+INVERTED_MASK = $F8 ; stored in inverse_mask when rendering in inverse video
+
+; ----------------------------------------------------------------------------
+; Defaults
+
+DEFAULT_TEXT_COLOR = $00
+DEFAULT_BG_COLOR = $C8
+DEFAULT_RMARGN = $3F
+
+; ----------------------------------------------------------------------------
+; ZP storage
+; Reuse some of the E:/S: devices' storage
+; These all get recalculated on col64_putbyte entry,
+; so it's probably OK to mix with GR.8 PLOT/DRAWTO stuff
+
+ seg.u "data"
+ org $A0 ; (used to be $90 aka OLDROW)
+mask_lo ds 1 ; Holds the 16-bit mask, used by render_glyph
+mask_hi ds 1
+screen_ptr_lo ds 1 ; Pointer to display RAM: render_glyph and scroll_screen
+screen_ptr_hi ds 1 ; both use this.
+font_index ds 1 ; index into font: TMPCHR * 5
+shift_amount ds 1 ; How many times to right-shift during render_glyph
+
+ ;org $63 ; aka LOGCOL
+glyph_data_lo ds 1 ; render_glyph stores (possibly shifted) glyph data
+glyph_data_hi ds 1 ; here. Also a 2nd display RAM pointer in scroll_screen
+lo_nybble_flag ds 1 ; non-zero if glyph data in top 4 bits of font
+
+ ;org $68 ; aka SAVADR
+inverse_mask ds 1 ; 0 for normal video, INVERTED_MASK for inverse
+line_buffer_index ds 1 ; used by col64_getbyte
+descender ds 1 ; offset-1 of true descender byte, into font_data
+
+; We also use several other ZP locations, normally used by the OS E: driver:
+; COLCRS ROWCRS TMPCHR BUFCNT RMARGN SAVMSC are used for the same purpose as
+; the OS uses them for.
+
+; ----------------------------------------------------------------------------
+; Non-ZP storage (cassette buffer for now)
+
+ org CASBUF
+line_buffer ds $80
+
+ seg "code"
+; ----------------------------------------------------------------------------
+; XEX segment header
+
+;START_ADDRESS_1 = $9C78
+START_ADDRESS_1 = $9C00 ; should end at $A036; subtract 2K to use with BASIC
+ org START_ADDRESS_1-6
+
+ word $FFFF
+ word START_ADDRESS_1
+ word END_ADDR_1
+
+; ----------------------------------------------------------------------------
+; Font data should be aligned on a page boundary
+; (for speed; still works unaligned). Each 5 bytes stores 2 glyphs
+; side-by-side. When rendering into 5x6 cells, the bottom line and
+; the left column are set to all 0 (or all 1 for inverse video) for padding,
+; so the glyphs can take up the entire 4x5 space.
+; Only character codes 32 through 127 are supported; this is 96
+; characters. At 2 glyphs per 5 bytes, that's 96/2*5=240 bytes,
+; which means the whole font fits into one page and can be
+; accessed with X or Y indexed mode rather than (indirect),Y.
+
+font_data:
+ ;include font4x5.inc
+ include col64_ext.inc
+
+DESCENDERS = $EB ; g j p q y descender bytes, offset from font_data
+
+; ----------------------------------------------------------------------------
+; Mask tables, used by setup_mask. Indexed by (COLCRS % 8), since they
+; would repeat every 8 bytes anyway. Each mask is 16 bits, and contains
+; a 1 for each pixel in screen RAM that we *don't* want to change when
+; writing pixels (because they're not part of the current character cell),
+; but see below...
+
+mask_lo_tab:
+ byte $07, $F8, $C1, $FE, $F0, $83, $FC, $E0
+
+; In mask_hi_tab, $00 is never a valid mask, while $FF means "don't touch any
+; bits in 2nd byte". As a minor optimization, $00 appears in the table in
+; place of $FF. This allows us to just test the Z flag after loading the mask
+; hi byte, instead of needing to compare against $FF.
+; (Actually, on further thought, the $FF's could have been left in, and the
+; test could have been made on the N flag: any hi mask with bit 7 set won't have
+; any other bits clear. *Shrug*)
+
+mask_hi_tab:
+ byte $00, $3F, $00, $0F, $7F, $00, $1F, $00
+
+; ----------------------------------------------------------------------------
+; Indexed by COLCRS%8, how many bits to shift the font data right
+; The mask_*_tab stuff above could be calculated at runtime from this,
+; the tables are only there for speed.
+
+shift_amount_tab:
+ byte $00, $05, $02, $07, $04, $01, $06, $03
+
+; ----------------------------------------------------------------------------
+; Line address tables, used by setup_screen_ptr. Indexed by ROWCRS. Used by
+; setup_screen_ptr
+
+line_addr_tab_lo:
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+
+line_addr_tab_hi:
+ byte $00, $00, $01, $02, $03, $04, $05, $06
+ byte $07, $08, $09, $0a, $0b, $0c, $0d, $0e
+ byte $0f, $0f, $10, $11, $12, $13, $14, $15
+ byte $16, $17, $18, $19, $1a, $1b, $1c, $1d
+
+; ----------------------------------------------------------------------------
+; Byte offset within scanline, indexed by COLCRS & $1F value
+; Used by setup_screen_ptr.
+
+column_byte_tab:
+ byte $00, $00, $01, $01, $02, $03, $03, $04
+ byte $05, $05, $06, $06, $07, $08, $08, $09
+ byte $0A, $0A, $0B, $0B, $0C, $0D, $0D, $0E
+ byte $0F, $0F, $10, $10, $11, $12, $12, $13
+
+; Used to be indexed by COLCRS, rest of the table was:
+ ;byte $14, $14, $15, $15, $16, $17, $17, $18
+ ;byte $19, $19, $1A, $1A, $1B, $1C, $1C, $1D
+ ;byte $1E, $1E, $1F, $1F, $20, $21, $21, $22
+ ;byte $23, $23, $24, $24, $25, $26, $26, $27
+
+; ----------------------------------------------------------------------------
+; Handler table (HATABS will point to this).
+; See the HATABS and EDITRV entries in Mapping the Atari for details.
+
+col64_vector_tab:
+ word col64_open-1 ; OPEN vector
+ word col64_close-1 ; CLOSE vector
+ word col64_getbyte-1 ; GET BYTE vector
+ word col64_putbyte-1 ; PUT BYTE vector
+ word col64_close-1 ; GET STATUS vector
+ word col64_close-1 ; SPECIAL vector
+ ;jmp col64_init ; Jump to initialization code (JMP LSB/MSB)
+ ; (Note: the OS really only ever calls the JMP init
+ ; routines for handlers in ROM, this could be empty)
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08 ; graphics mode 8
+ sta ICAX2Z
+ lda #$0C ; R/W access
+ sta ICAX1Z
+ jsr open_s_dev
+
+ ; Set default colors
+ lda #DEFAULT_BG_COLOR
+ sta COLOR2
+ sta COLOR4
+ lda #DEFAULT_TEXT_COLOR
+ sta COLOR1
+
+ ; Protect ourselves from the OS
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ rts
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi
+ pha
+ lda s_dev_open_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL64 maintains a line buffer. Each time col64_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is not exactly how the OS E: device works: it reads keystrokes but
+; doesn't buffer them, until Return is hit; then it reads from screen
+; memory, at the current cursor line (and the line(s) before/after,
+; depending on its map of logical => physical lines). We can't do that
+; because we don't store character codes in screen memory... although
+; we *could* support insert/delete character, delete-line, and left/right
+; arrows. We don't, to save driver code size...
+
+; This code was borrowed from COL80, then big chunks of it were diked out
+; and/or optimized.
+
+col64_getbyte:
+ lda BUFCNT
+ beq get_line ; See if there are bytes left in the buffer
+
+get_next_byte: ; Yes: return next byte from the buffer
+ ldx line_buffer_index
+ lda line_buffer,x
+ dec BUFCNT
+ inc line_buffer_index
+ jmp return_success
+
+; Buffer is empty.
+; Get a line of input from the user, terminated by the Return key.
+get_line:
+ lda #$00
+ sta BUFCNT
+ sta line_buffer_index
+
+show_cursor:
+ jsr print_inv_space
+ jsr get_keystroke
+
+; code meant to deal with BREAK key, left out 'cause FujiChat disables BREAK
+; cpy #$01
+; beq keystroke_ok
+; ldy #0
+; sty line_buffer_index
+; sty BUFCNT
+
+keystroke_ok:
+ cmp #$20
+ bcc show_cursor ; ignore low ASCII
+ cmp #EOL
+ beq return_key_hit
+
+check_backs_key:
+ cmp #$7E
+ beq backs_key_hit
+
+;check_clear_key: ; don't bother, don't need
+ ; (if we did want this, it should check delete-line instead!)
+ ;;cmp #$7D
+ ;;beq clear_key_hit
+
+normal_key_hit:
+ ldx BUFCNT
+ bmi show_cursor
+
+buffer_character:
+ sta line_buffer,x
+ jsr col64_putbyte
+ inc BUFCNT
+ bne show_cursor
+
+return_key_hit:
+ jsr print_space
+ lda #EOL
+ ldx BUFCNT
+ sta line_buffer,x
+ inc BUFCNT
+ jsr col64_putbyte
+ bne get_next_byte ; col64_putbyte always clears Z flag!
+
+;;clear_key_hit:
+; jsr clear_screen ; if we implemented it...
+;; lda #$00
+;; sta line_buffer_index
+;; sta BUFCNT
+;; beq get_line
+
+backs_key_hit:
+ jsr print_space
+ lda BUFCNT
+ beq backs_key_done
+ dec COLCRS
+ lda COLCRS
+ clc
+ adc #$01
+ cmp LMARGN
+ bne backs_same_line
+ lda RMARGN
+ sta COLCRS
+ dec ROWCRS
+
+backs_same_line:
+ dec BUFCNT
+
+backs_key_done:
+ jmp show_cursor
+
+; ----------------------------------------------------------------------------
+; Print a space or inverse space character at the current cursor position.
+; Does not update the cursor position.
+
+print_inv_space:
+ lda #INVERTED_MASK
+ byte $2C
+
+print_space:
+ lda #$00
+ sta inverse_mask
+ lda #$00
+ sta TMPCHR
+ jmp render_glyph
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+
+get_keystroke:
+ lda k_dev_get_hi
+ pha
+ lda k_dev_get_lo
+ pha
+ ;rts ; fall through to return_success
+
+
+; ----------------------------------------------------------------------------
+; Unimplemented CIO callbacks here. Also various other routines jump here
+; to return success to the caller.
+
+col64_close:
+return_success:
+ ldy #$01
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO OPEN command callback
+
+col64_open:
+ jsr init_graphics_8
+ lda #$00
+ sta ROWCRS
+ sta COLCRS
+ sta BUFCNT
+ sta LMARGN
+ lda #DEFAULT_RMARGN
+ sta RMARGN
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO PUT BYTE command callback
+; The byte to put is passed to us in the accumulator.
+
+col64_putbyte:
+ ; EOL (decimal 155)?
+ cmp #EOL
+;;; bne check_clear
+ bne regular_char
+ lda RMARGN
+ sta COLCRS
+ jmp skip_write
+
+;;;check_clear:
+;;; ; save memory by not including clear_screen
+;;; ; (also, this lets us print the } character)
+;;; ; Clear (decimal 125)?
+;;; cmp #$7D
+;;; bne regular_char
+;;; jmp clear_screen
+;;; .endif
+;;;
+
+; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax
+ bpl not_inverse
+ lda #INVERTED_MASK
+ .byte $2C ; aka BIT abs, skip the LDA
+not_inverse:
+ lda #$00
+ sta inverse_mask
+
+ txa
+ and #$7F
+ sec
+ sbc #$20 ; subtract $20 because we only handle codes $20 to $7F
+ bcs not_low_ascii
+ jmp return_success ; ignore any chr codes $00-$1F or $80-$9F
+
+not_low_ascii:
+ sta TMPCHR
+
+ lda DINDEX ; OS stores current graphics mode here
+ cmp #$08
+ beq graphics_ok
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col64_open
+
+graphics_ok:
+ jsr render_glyph
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor
+
+; Could implement SSFLAG logic here
+;check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ ;lda SSFLAG
+ ;bne check_ssflag
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Call the routines that actually print the character.
+; render_glyph prints the character in TMPCHR at the current
+; COLCRS and ROWCRS, and does NOT advance the cursor.
+; TMPCHR should already have bit 7 stripped; render_glyph will
+; use inverse_mask, so the caller should have set that up as well.
+
+; Note: The 4 subroutines were only ever called from render_glyph,
+; so to save a tiny bit of time and space, they're now inline code.
+
+render_glyph:
+ ;jsr setup_mask
+ ;jsr setup_screen_ptr
+ ;jsr setup_font_index
+ ;jmp write_font_data
+
+; ----------------------------------------------------------------------------
+; mask is used to avoid overwriting pixels outside the character cell
+; we're currently writing. Since 5 pixel wide cells don't align on byte
+; boundaries in screen RAM, we have to read/modify/write 2 bytes, and
+; the mask also has to be 2 bytes wide.
+; Also we set up shift_amount here.
+
+setup_mask:
+ lda COLCRS
+ and #$07
+ tax
+ lda mask_lo_tab,x
+ sta mask_lo
+ lda mask_hi_tab,x
+ sta mask_hi
+ lda shift_amount_tab,x
+ sta shift_amount
+ ;rts
+
+
+; ----------------------------------------------------------------------------
+; Make (screen_ptr_lo) point to the first byte of screen RAM on the top line
+; of the current char cell. Assumes COLCRS/ROWCRS are never out of range!
+setup_screen_ptr:
+ ; first the row... table lookup quicker than mult by 240
+ ldx ROWCRS ; +3 = 3
+ clc ; +2 = 5
+ lda SAVMSC ; +3 = 8
+ adc line_addr_tab_lo,x ; +4 = 12
+ sta screen_ptr_lo ; +3 = 15
+ lda SAVMSC+1 ; +3 = 18
+ adc line_addr_tab_hi,x ; +4 = 22
+ sta screen_ptr_hi ; +3 = 25
+
+ ; now do the column. column_byte_tab is only a half-table, so do lookup
+ ; on bits 0-4 of COLCRS, then add 20 decimal if bit 5 of COLCRS was set.
+ lda COLCRS
+ tay
+ and #$1F
+ tax
+ lda column_byte_tab,x
+ cpy #$20
+ bcc ssp_noadd
+ adc #$13 ; +1 because C set = 20 dec
+
+ssp_noadd:
+ clc
+ adc screen_ptr_lo
+ sta screen_ptr_lo
+ lda #0
+ adc screen_ptr_hi
+ sta screen_ptr_hi
+
+ ;rts
+
+; ----------------------------------------------------------------------------
+; Set up font_index to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+; Calculation is:
+; lo_nybble_flag = (TMPCHR & 1) ? $FF : $00;
+; font_index = (TMPCHR >> 1) * 5;
+
+setup_font_index:
+ lda #$00
+ sta lo_nybble_flag
+ lda TMPCHR
+ lsr ; a = (TMPCHR >> 1)
+ tay ; y = a
+ bcc font_hi_nybble
+ dec lo_nybble_flag ; = $FF
+
+font_hi_nybble:
+ clc
+ asl ; a *= 2
+ asl ; a *= 2
+ sta font_index
+ tya
+ adc font_index
+ sta font_index
+
+ ; rts
+
+
+; ----------------------------------------------------------------------------
+; True descender support: we've got a hard-coded list of 5 characters
+; (g j p q y) that have them. All the descender graphics are stored in the
+; bottom nybble of the last glyph in the font, which means we can only have
+; 5 characters that have descenders.
+; TODO: tighten up this code some (faster/smaller)
+
+ lda TMPCHR
+ ldx #$FF
+
+ cmp #'g-$20
+ bne chk_j
+ ldx #DESCENDERS-1
+chk_j:
+ cmp #'j-$20
+ bne chk_p
+ ldx #DESCENDERS
+chk_p:
+ cmp #'p-$20
+ bne chk_q
+ ldx #DESCENDERS+1
+chk_q:
+ cmp #'q-$20
+ bne chk_y
+ ldx #DESCENDERS+2
+chk_y:
+ cmp #'y-$20
+ bne not_y
+ ldx #DESCENDERS+3
+
+not_y:
+ stx descender
+
+; ----------------------------------------------------------------------------
+; When write_font_data is called, all this stuff must be set up:
+; - font_index is the 1-byte index into font_data where the current glyph is
+; - lo_nybble_flag is 0 for high nybble of glyph data, $FF for low
+; - mask_lo/hi is our 16-bit pixel mask (1's are "leave original data")
+; - shift_amount is # of times to shift glyph data right
+; - screen_ptr_lo/hi points to the 1st byte on the top line
+; - inverse_mask is 0 for normal or INVERTED_MASK for inverse
+; - descender is the offset *minus one* of the byte holding the bottom 4
+; pixels in the 4x6 character. Most of the time this will be $FF,
+; AKA the the offset from font_data of the first byte of the space glyph
+; (minus one), which has 0000 in its top nybble. The rest of the time,
+; the descenders are taken from the bottom nybble of the last character
+; glyph (which would be the unprintable code $7F). The logic that does
+; the descenders is hard-coded to use the top nybble for $FF and the
+; bottom nybble for anything else.
+
+; Loop 5 times, each time thru the loop:
+; - extract 4-bit glyph data, store in glyph_data_lo
+; - apply inverse_mask
+; - shift right shift_amount times
+; ...write data...
+; - add 40 to 16-bit screen_ptr_lo/hi (to get to next line)
+; ...then one more loop with font_index and lo_nybble_flag set
+; to a byte in the space glyph, to handle the bottom row (which
+; is always 0 for normal or all 1's for inverse)
+
+write_font_data:
+ ldx #$05 ; outer loop counter, aye
+
+wfont_line_loop:
+ lda #$00
+ sta glyph_data_hi
+
+ ldy font_index
+ lda font_data,y ; note: entire font must fit in one page!
+
+ bit lo_nybble_flag
+ beq use_hi_nybble
+
+ asl ; the pixels we want are in the low nybble of the font data byte.
+ asl ; shift them up to the top nybble
+ asl
+ asl
+
+use_hi_nybble: ; 4-bit glyph data now in hi nybble
+ and #$F0
+ eor inverse_mask
+ sta glyph_data_lo
+
+ ldy shift_amount
+ beq wfont_no_shift
+
+wfont_shift_loop: ; right-shift 16-bit glyph data shift_amount times
+ lsr glyph_data_lo
+ ror glyph_data_hi
+ dey
+ bne wfont_shift_loop
+
+wfont_no_shift: ; Y always zero when we get here
+ lda mask_lo
+ and (screen_ptr_lo),y
+ ora glyph_data_lo
+ sta (screen_ptr_lo),y
+
+ lda mask_hi
+ beq wfont_skip_hi ; don't bother with 2nd screen byte if we don't need to
+ iny
+ and (screen_ptr_lo),y
+ ora glyph_data_hi
+ sta (screen_ptr_lo),y
+
+wfont_skip_hi:
+ dex
+ bmi wfont_done
+ bne wfont_not_bottom
+
+ ;stx font_index
+ ;stx lo_nybble_flag
+
+; X always 0 here: for last line, use the descender (if there's no
+; descender for this char, that's $FF. font_index will get inc'ed,
+; meaning non-decender chars use the first byte of the space glyph
+; as their "descender")
+ lda descender
+ sta font_index
+ cmp #$FF
+ beq wfont_not_bottom
+ sta lo_nybble_flag
+
+wfont_not_bottom:
+ lda #$28 ; add 40 bytes to point to next line of screen RAM
+ clc
+ adc screen_ptr_lo
+ sta screen_ptr_lo
+ bcc wfont_noinc
+ inc screen_ptr_hi
+
+wfont_noinc:
+ inc font_index
+ bne wfont_line_loop ; branch always
+
+wfont_done:
+ rts
+
+; ----------------------------------------------------------------------------
+; Not the fastest scroller in the west... TODO: make faster :)
+
+; lda_operand points to line N (minus one byte)
+; sta_operand points to line N+1 (minus one byte)
+; Y ranges 240 to 1 in the loop, hence the -1 byte
+; CAUTION: Self-modifying code! Proceed with caution.
+
+; This version gives us overall driver speed almost 20% faster
+; than the original scroll_screen (last commented-out one below)
+; Also just scrolling 250 times is slightly faster than COL80
+; (1505 jiffies; setting CRITIC saves 48 jiffies)
+; (makes it 17% the speed of the OS E: driver, where COL80 is 15%)
+; Note that E80 is slightly over twice as fast at this as the OS!
+
+; Note about performance where scrolling is *not* concerned:
+; Printing 914 non-control characters on a freshly-cleared screen:
+; OS E: - 172 jiffies (subtract 12 = 160 jiffies if cursor disabled)
+; E80 - 168 jiffies (about same as OS E:)
+; COL80 - 116 jiffies (yes, it's fastest!)
+; CON64 from SDX 4.41 - 227 jiffies first time I tried, crashed next time!
+; COL64 - 142 jiffies (still faster than OS E:)
+
+scroll_screen:
+; lda SDMCTL
+; pha
+; lda #0
+; sta SDMCTL
+
+; lda CRITIC
+; pha
+; lda #1
+; sta CRITIC
+
+ lda SAVMSC
+ sec
+ sbc #1
+ sta lda_operand
+ lda SAVMSC+1
+ sbc #0
+ sta lda_operand+1
+ ldx #LAST_ROW
+
+scroll_line_loop:
+ ldy #$F0
+
+ lda lda_operand+1
+ sta sta_operand+1
+ lda lda_operand
+ sta sta_operand
+ clc
+ adc #$F0
+ sta lda_operand
+ bcc ss_noinc
+ inc lda_operand+1
+ss_noinc:
+
+scroll_byte_loop:
+lda_operand = *+1
+ lda 0,y
+sta_operand = *+1
+ sta 0,y
+ dey
+ bne scroll_byte_loop
+ dex
+ bne scroll_line_loop
+
+scroll_blank:
+ lda lda_operand
+ sta sta2_operand
+ lda lda_operand+1
+ sta sta2_operand+1
+ lda #0
+ ldy #$F0
+sblank_loop:
+sta2_operand = *+1
+ sta 0,y
+ dey
+ bne sblank_loop
+
+; pla
+; sta SDMCTL
+; pla
+; sta CRITIC
+ rts
+
+;; This version is faster and fully functional
+;; (overall driver speed is 10% faster than with the
+;; one below)
+; glyph_data_lo points to line N (minus one byte)
+; screen_ptr_lo points to line N+1 (minus one byte)
+; Y ranges 240 to 1 in the loop, hence the -1 byte
+
+;;scroll_screen:
+;; lda SAVMSC
+;; sec
+;; sbc #1
+;; sta screen_ptr_lo
+;; lda SAVMSC+1
+;; sbc #0
+;; sta screen_ptr_hi
+;; ldx #LAST_ROW
+;;
+;;scroll_line_loop:
+;; ldy #$F0
+;;
+;; lda screen_ptr_hi
+;; sta glyph_data_hi
+;; lda screen_ptr_lo
+;; sta glyph_data_lo
+;; clc
+;; adc #$F0
+;; sta screen_ptr_lo
+;; bcc ss_noinc
+;; inc screen_ptr_hi
+;;ss_noinc:
+;;
+;;scroll_byte_loop:
+;; lda (screen_ptr_lo),y
+;; sta (glyph_data_lo),y
+;; dey
+;; bne scroll_byte_loop
+;; dex
+;; bne scroll_line_loop
+;;
+;;scroll_blank:
+;; lda #0
+;; ldy #$F0
+;;sblank_loop:
+;; sta (screen_ptr_lo),y
+;; dey
+;; bne sblank_loop
+;;
+;; rts
+
+; Clock cycle timings:
+; 1792080 CPU cycles per second (or is it 1789773?)
+; 29868 per jiffy on NTSC (1/60 sec)
+; DL = 174 bytes @ 1 cycle each
+; Screen RAM = 7680 bytes @ 1 ea
+; Refresh = 262 * 9 = 2358
+; so ANTIC steals 10212 (34.2%) cycles, leaves 19656 (65.8%)
+; Of that time, the OS steals some doing VBLANK processing.
+; It may be that I can set CRITIC here and get a little of
+; that back (depends on what, if anything, that does to
+; the RS232 driver and/or custom keybuffer stuff in FujiChat).
+
+; Now if I could actually do a 100% unrolled scroller, simply
+; LDA blah:STA blah-1 7680 times, with NMI/VBI/ANTIC disabled,
+; that would be 4+4=8 cycles times 7680 = 61440, or 3.12 frames
+; (or 0.052 sec, call it 1/20 sec). Obviously can't do it that way.
+
+; Did some tests of overall performance (not just scrolling: print
+; 24 lines of 35 chars, then 24 newlines, repeat in a loop 10x)
+; Turning off ANTIC DMA seems to save 25% time. Setting CRITIC only
+; saves 3% or so. Disabling IRQs/NMIs entirely is probably not an
+; option.
+
+;; old (slower, but working) version:
+;; scroll_screen:
+;; lda #0 ; +2 = 2
+;; sta COLCRS ; +3 = 5
+;; sta ROWCRS ; +3 = 8
+;; jsr setup_screen_ptr ; +6 = 14, +54 = 68
+;;
+;; scroll_line_loop:
+;; lda screen_ptr_lo ; +3 = 3
+;; sta glyph_data_lo ; +3 = 6
+;; lda screen_ptr_hi ; +3 = 12
+;; sta glyph_data_hi ; +3 = 15
+;; ldx ROWCRS ; +3 = 18
+;; cpx #LAST_ROW ; +2 = 20
+;; beq scroll_blank ; +2 = 22 (+1 more last time thru)
+;; inx ; +2 = 24
+;; stx ROWCRS ; +3 = 27
+;; jsr setup_screen_ptr ; +6+54 = 87
+;; ldy #0 ; +2 = 89
+;; ; times 31 is 2759, +1 = 2760
+;;
+;; scroll_byte_loop:
+;; lda (screen_ptr_lo),y ; +5 = 5
+;; sta (glyph_data_lo),y ; +6 = 11
+;; iny ; +2 = 13
+;; cpy #$F0 ; +2 = 15
+;; bne scroll_byte_loop ; +3 = 18 (-1 last time thru)
+;; ; ...times 31 times 240 - 1 = 133919 (!)
+;; beq scroll_line_loop ; +3*31-1 (92)
+;;
+;; scroll_blank:
+;; jsr setup_screen_ptr ; +6+54 = 60
+;; ldy #0 ; +2 = 62
+;; tya ; +2 = 64
+;; sblank_loop:
+;; sta (screen_ptr_lo),y ; +6 = 6
+;; iny ; +2 = 8
+;; cpy #$F0 ; +2 = 10
+;; bne sblank_loop ; +3 = 13 (-1 last time)
+;; ; times 240, minus 1 = 3119
+;;
+;; rts ; +6
+;;
+;; Total routine time is 68 + 2760 + 133919 + 92 + 64 + 3119 + 6 = 140028
+;; Divide by free cyc/frame: 140028/19656 = 7.12 frames, or 0.11 sec,
+;; not counting VBLANK overhead. 95% of the time is of course in the
+;; inner loop. Every cycle saved in the inner loop is worth about
+;; 5% of the runtime! So switching from incrementing to decrementing
+;; Y will save 10% of the time (from not having the CPY). Using self-
+;; modifying code for the lda/sta saves 2 more cycles (10% more), but
+;; adds a small bit of overhead in the outer loop.
+;; The scroll_blank loop is only 2.2% of the total time. Every cycle
+;; shaved off its loop is worth only 1/3 of a percent of the total
+;; time (switching to dey is worth 2/3 of 1%).
+;; Replace jsr setup_screen_ptr in scroll_line_loop with loading from
+;; the tables directly will save approx. 35 cycles per outer loop,
+;; or only about 0.8%.
+;; So total savings is 20% + 0.6% + 0.8% = 21.4%, meaning real time
+;; drops to approx 0.085 sec, or approx 5.5 NTSC frames (another way
+;; to look at it: 11.75 scrolled lines/sec instead of the original 9)
+;; Yet another way: 2 1/3 seconds to scroll the whole screen, vs
+;; the original 3 1/2. Still abysmal.
+
+;; One possibility would be to borrow a page from the ACE-80 book and
+;; update LMSes within the DL. This would bloat the display list by
+;; 64 bytes (not so bad). We'd basically treat screen RAM as a circular
+;; buffer of 32 lines. Every scroll, update the LMS operands to point
+;; to the next line-buffer, and whichever buffer is the last visible
+;; line needs to be blanked. Got to see how much code this will add
+;; (possibly the routine that does this might not be longer than the
+;; scroll_screen I've been using). ACE-80 (or anyway E80) uses way
+;; more screen RAM than it looks like it needs, plus DLIs.
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS
+ lda RMARGN
+ cmp COLCRS
+ bcs same_line
+ lda LMARGN
+ sta COLCRS
+ lda ROWCRS
+ cmp #LAST_ROW
+ bcc no_scroll
+ jsr scroll_screen
+ ; Move to last row after scrolling
+ lda #LAST_ROW-1
+ sta ROWCRS
+
+no_scroll:
+ inc ROWCRS
+
+same_line:
+ rts
+
+END_ADDR_1 = *-1
+
+
+; ----------------------------------------------------------------------------
+; Initialization. If we don't want the handler to survive a warmstart, we
+; can load this bit into e.g. the cassette buffer (throw away after running)
+
+START_ADDRESS_2 = CASBUF
+
+; XEX segment header for throwaway init code
+ rorg START_ADDRESS_2-4
+ word START_ADDRESS_2
+ word END_ADDR_2
+
+col64_init:
+ ldy #$00
+
+next_hatab_slot:
+ lda HATABS,y
+ beq register_x_handler
+ iny
+ iny
+ iny
+ cpy #$20
+ bcc next_hatab_slot
+ jmp return_success
+
+register_x_handler:
+ lda #$58
+ sta HATABS,y
+ lda #<col64_vector_tab
+ iny
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+ jmp return_success
+
+main_entry_point:
+ jsr col64_init
+ lda #$0C
+ sta ICCOM
+ ldx #$00
+ jsr CIOV
+ lda #$58
+ sta font_index
+ lda #$03
+ sta ICCOM
+ lda #font_index
+ sta ICBAL
+ lda #$00
+ sta ICBAH
+ ldx #$00
+ jsr CIOV
+ ldy #$07
+ lda #<col64_vector_tab
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+no_e_handler:
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ jmp return_success
+
+END_ADDR_2 = *-1
+
+; XEX segment (run address)
+ word INITAD
+ word INITAD+1
+ word main_entry_point
+
+; That's all, folks...
+
+; Rest of file is me rambling & meandering, ignore or not as you choose
+
+; Possible improvements, some of which may apply to this driver only,
+; some of which may apply to a (to be written) 40-column renderer.
+; Redb3ard has designed really nice 8x8 normal, bold, italic fonts,
+; including a bunch of Unicode normal characters... the 40-column
+; driver would include UTF-8 support. Of course there's not enough
+; RAM for an IRC client, TCP/IP stack, screen/DL memory, driver,
+; UTF-8 tables, and 3 or 4 fonts... will have to wait until after
+; the 1.0 FujiChat release (my roadmap for 1.0 is that everything
+; needs to work on a 48K unmodded 800; 2.0 will have new features
+; that may only work on an XL or even require 130XE banks, though
+; it will still be as functional as 1.0, on an 800).
+
+; True descenders and 5-bit-wide characters.
+
+; For descenders, could simply leave the top row of pixels blank on
+; the screen, and draw the 5 rows of character in the bottom 5 of
+; the 6-scanline block. They'd possibly touch the character on the
+; next line...
+
+; 5-bit-wide characters should be used sparingly: only M W m w T
+; and maybe Y V v # need them. The "extra" bit could go on the left,
+; and just be a copy of the rightmost bit, since these characters
+; are symmetrical... but these would often touch the character on
+; the left. Capital letters, it's less of a big deal in normal English
+; text, since a capital letter should be preceded by a space (or at
+; least punctuation), and it won't touch the character on the right
+; unless it's another 5-bit-wide one (few words in English are going
+; to have that problem; maybe the name AMY in all caps). Unfortunately
+; I can't think of a good way to encode the bits of information that
+; say a character needs the extra pixel (or a descender either) other
+; than a hard-coded set of compares against specific char codes, or
+; else a loop over a table of them. Either way there's a loss of
+; performance: most characters will fail all the compares...
+; It'd be possible to do a 5x5 font, or even 5x6, but 5 bits wide
+; means we can't pack the pixel data 2 rows per byte (so the
+; font won't fit in a page any more, plus we have to use (zp),y
+; or something to access it...)
+
+; Multiple font support. Since it's an IRC-specific driver, could just
+; have _putbyte directly interpret the IRC protocol formatting codes,
+; render e.g. bold as inverse, italic as underline if I implement it,
+; or else do up a separate italic font (if it's possible to make one
+; look good in 4x5). _putbyte could at least strip out the codes it
+; can't render (e.g. color).
+
+; I've thought of doing underline (either a separate mode, or instead
+; of inverse video), but a lot of the glyphs will look like crap with
+; the underline, because there's no room for spacing: the underline
+; will touch the bottom pixels of most characters (and overwrite the
+; descenders if we add true descender support...)
+
+; Obviously, making it a fully-functional E: replacement would be nice.
+; I'm not doing this because I'm only wanting to use the driver for
+; text-only cc65 programs (specifically FujiChat), though possibly
+; I'll come back to col64 and do a proper version later.
+
+; Also nice: user-adjustable number of rows. Most peoples' monitors can
+; display something above 200 scanlines (particularly if they're in PAL
+; countries). As-is, we're using 192 scanlines to get 32 rows (of 6 lines
+; each). Most people could easily display 34 rows (204 scanlines), and
+; not a few could display 35 (210), particularly if the blanking
+; instructions at the start of the display list are user-adjustable too
+; (to move the picture up or down). Memory usage for video RAM would
+; grow by 240 byte per row of characters, and of course we'd need code
+; to set up the custom display list (which would be longer than a
+; normal one for GR.8). Probably would put a limit of 36 or 40 rows
+; since the various tables are fixed-size...
+
+; If there were RAM enough for it, or if we decide to use XE extra
+; banks (or XL/XE under-OS RAM), could have _putbyte also store
+; every output character in a buffer, for FujiChat to use as
+; scrollback/log buffer (or any other program to use as it sees
+; fit, of course).
+
+; User-loadable font isn't a bad idea: the init code can look for a
+; file D:COL64.FNT and load it into font_data if found.
+
+; Could implement standard ASCII backspace/tab/linefeed/CR/etc codes,
+; using low ASCII codes. This would be suitable for a telnet or terminal
+; client (not needed for IRC)
+
+; I really would like to do auto-relocation. Program could load itself
+; wherever, and relocate itself (using a table of offsets, for absolute
+; addresses within the program) to either MEMLO or MEMTOP. This would
+; mean more init code only.
+
+; It'd be nice to speed up scrolling. One dumb trick would be to use
+; self-modifying code: instead of (zp),y addressing, use abs,y
+; in the inner loop, and the outer loop modifies the operands in
+; the inner. Would mean the code can't be burned to ROM, but who
+; was planning to do that anyway? Also simply moving more than one
+; chunk per outer-loop iteration would be a small speedup, and so
+; would moving 256 bytes per, instead of 240.
+; Since the inner loop does lda (zp),y [5+cyc] and sta (zp),y [6cyc]
+; 7440 times, replacing them with lda abs,y [4+cyc] and sta abs,y
+; [5cyc] should save 7440*2 = almost 15K cycles.
+; which may not be noticeable... Unrolling the loop is even less of a
+; gain: the outer loop only runs 32 times. Could set CRITIC during the
+; move (not sure that helps much). No matter how you slice it,
+; moving 8K on a 6502 is *slow*.
+
+; One slightly cool idea would be to do a proper OPEN of channel #6
+; to S:, like the BASIC GR. command does, instead of the "shortcut"
+; using ZIOCB and calling the S: open routine directly. Doing this
+; would allow PLOT, DRAWTO, and XIO 18 (fill).
diff --git a/src/col64/col64_ext.inc b/src/col64/col64_ext.inc
new file mode 100644
index 0000000..81e7660
--- /dev/null
+++ b/src/col64/col64_ext.inc
@@ -0,0 +1,48 @@
+ byte $04, $04, $04, $00, $04 ; [0] 32,33 ,!
+ byte $AA, $AF, $0A, $0F, $0A ; [5] 34,35 ",#
+ byte $70, $A9, $62, $54, $E9 ; [10] 36,37 $,%
+ byte $42, $A2, $44, $A0, $D0 ; [15] 38,39 &,'
+ byte $24, $42, $42, $42, $24 ; [20] 40,41 (,)
+ byte $A4, $44, $EE, $44, $A4 ; [25] 42,43 *,+
+ byte $00, $00, $0F, $20, $40 ; [30] 44,45 ,,-
+ byte $02, $02, $04, $08, $48 ; [35] 46,47 .,/
+ byte $64, $9C, $B4, $D4, $6E ; [40] 48,49 0,1
+ byte $6E, $91, $26, $41, $FE ; [45] 50,51 2,3
+ byte $2F, $68, $AE, $F1, $2E ; [50] 52,53 4,5
+ byte $7F, $81, $E2, $94, $64 ; [55] 54,55 6,7
+ byte $66, $99, $67, $91, $6E ; [60] 56,57 8,9
+ byte $00, $42, $00, $02, $44 ; [65] 58,59 :,;
+ byte $20, $4F, $80, $4F, $20 ; [70] 60,61 <,=
+ byte $87, $49, $22, $40, $82 ; [75] 62,63 >,?
+ byte $66, $B9, $BF, $89, $69 ; [80] 64,65 @,A
+ byte $E6, $99, $E8, $99, $E6 ; [85] 66,67 B,C
+ byte $EF, $98, $9E, $98, $EF ; [90] 68,69 D,E
+ byte $F7, $88, $EB, $89, $86 ; [95] 70,71 F,G
+ byte $9E, $94, $F4, $94, $9E ; [100] 72,73 H,I
+ byte $39, $1A, $1C, $9A, $69 ; [105] 74,75 J,K
+ byte $8A, $8F, $8D, $89, $F9 ; [110] 76,77 L,M
+ byte $96, $D9, $B9, $99, $96 ; [115] 78,79 N,O
+ byte $E6, $99, $E9, $8A, $85 ; [120] 80,81 P,Q
+ byte $E7, $98, $E6, $A1, $9E ; [125] 82,83 R,S
+ byte $F9, $49, $49, $49, $46 ; [130] 84,85 T,U
+ byte $99, $99, $9D, $AF, $4A ; [135] 86,87 V,W
+ byte $99, $99, $66, $92, $94 ; [140] 88,89 X,Y
+ byte $F6, $24, $44, $84, $F6 ; [145] 90,91 Z,[
+ byte $86, $82, $42, $22, $26 ; [150] 92,93 \,]
+ byte $40, $A0, $00, $00, $0F ; [155] 94,95 ^,_
+ byte $40, $47, $29, $0B, $05 ; [160] 96,97 `,a
+ byte $80, $87, $E8, $98, $E7 ; [165] 98,99 b,c
+ byte $10, $16, $79, $9E, $77 ; [170] 100,101 d,e
+ byte $60, $47, $E9, $47, $41 ; [175] 102,103 f,g
+ byte $84, $80, $EC, $94, $9E ; [180] 104,105 h,i
+ byte $28, $0A, $6C, $2A, $29 ; [185] 106,107 j,k
+ byte $C0, $4A, $4F, $4D, $E9 ; [190] 108,109 l,m
+ byte $00, $E6, $99, $99, $96 ; [195] 110,111 n,o
+ byte $00, $E7, $99, $E7, $81 ; [200] 112,113 p,q
+ byte $00, $A7, $DC, $83, $8E ; [205] 114,115 r,s
+ byte $40, $E9, $49, $49, $26 ; [210] 116,117 t,u
+ byte $00, $99, $9D, $AF, $4A ; [215] 118,119 v,w
+ byte $00, $99, $69, $66, $92 ; [220] 120,121 x,y
+ byte $06, $F4, $28, $44, $F6 ; [225] 122,123 z,{
+ byte $4C, $44, $42, $44, $4C ; [230] 124,125 |,}
+ byte $06, $5C, $A8, $01, $0C ; [235] 126,127 ~,
diff --git a/src/col64/cruft/col64.dasm b/src/col64/cruft/col64.dasm
new file mode 100644
index 0000000..aca1259
--- /dev/null
+++ b/src/col64/cruft/col64.dasm
@@ -0,0 +1,1194 @@
+
+; ----------------------------------------------------------------------------
+; 64x32 software text driver
+; Uses 4x5 font in 5x6 character cells
+; Based on disassembled COL80 driver
+
+; This driver is missing quite a few things a full E: driver should have:
+
+; - Does not work with BASIC or any other cart! Though if START_ADDRESS_1
+; is changed to $7Cxx, a BASIC-able version could be assembled
+
+; - No support for cursor controls, insert/delete, or even clear screen
+; (instead the control-codes are printed as normal characters, if they're
+; above 31 decimal). This is a feature: our intended application is an
+; IRC client, where ASCII codes 125 and 126 represent } and ~ chars,
+; not clear-screen and backspace.
+
+; - Backspace key is supported during get-byte, but printing a backspace
+; with put-byte prints a tilde instead. Again, a feature.
+
+; - No support for low ASCII at all: any attempt to input or print a character
+; in the range 0-31 decimal is just ignored (this includes the arrow keys).
+; This is done to keep the font size at 96 characters, so it'll fit in a
+; page. Also IRC doesn't use low-ASCII.
+
+; - Does not attempt to survive a warmstart
+
+; - Will fail disastrously if an application sets COLCRS/ROWCRS to any
+; out-of-range values
+
+; - Only displays the cursor during get-byte operations
+
+; On the other hand, this driver is tiny (font is 240 bytes, code 718, not
+; counting 100 bytes of throwaway init code in the tape buffer), and plays
+; nice with cc65's stdio support (though NOT conio, don't even go there)
+
+; Theory of operation:
+
+; This is an Atari OS-compliant device driver. On load, the init routine
+; replaces the E: entry in HATABS with a pointer to our vector table,
+; col64_vector_tab.
+
+; We implement the CIO commands OPEN, CLOSE, GETBYTE, and PUTBYTE. The
+; GET-STATUS and SPECIAL commands are not implemented, and the CLOSE
+; command simply returns success (it doesn't need to do anything else).
+
+; When a channel is OPENed to our new E: device, the col64_open routine
+; calls part of the OS's S: handler to switch to GRAPHICS 8 (320x192 mono)
+; mode.
+
+; When the CIO PUT-BYTES or PUT-RECORD calls are made on our channel, CIO
+; calls our PUTBYTE routine (col64_putbyte) as needed to write (print)
+; characters to the screen. col64_putbyte keeps track of the current
+; cursor position (using COLCRS and ROWCRS), and either renders a glyph
+; at the current location, or (when the EOL character $9B is printed)
+; moves the cursor to the beginning of the next line, scrolling the
+; display RAM if necessary.
+
+; When the CIO GET-BYTES or GET-RECORD calls are made on our channel, CIO
+; calls our GETBYTE routine (col64_getbyte). This routine maintains its
+; own buffer of user-input characters. When first called (or any call when
+; the buffer is empty), col64_getbyte reads a complete line of input using
+; the OS's K: handler, echoing typed characters to the screen using our
+; own col64_putbyte. Only the backspace key is supported for editing. Once
+; the user presses Return, the first byte in the buffer is returned to
+; the caller. On subsequent calls, characters are returned from the buffer
+; until the buffer is empty. At this point, the next call to col64_getbyte
+; will result in a new line of input being read.
+
+; col64_putbyte calls render_glyph to draw a character in display RAM.
+; The font consists of 96 characters (low ASCII not supported), each 4 pixels
+; wide and 5 tall [*]. These are rendered into 5x6 character cells, with the
+; extra pixels being left blank to provide padding between characters.
+; Since 5 pixel wide cells don't line up evenly on display RAM byte
+; boundaries, render_glyph has to shift each 4-pixel line of glyph
+; data the appropriate number of times, and combine the result with the
+; rest of each screen byte (that portion that's outside of the 5-pixel
+; cell we're currently writing to). Surprisingly, this is accomplished
+; slightly faster than the standard OS E: driver prints a single character.
+; (unfortunately, scrolling the screen is *much* slower than the OS E:
+; driver's scrolling...)
+
+; [*] ...except the lowercase q j p q y, which have true descenders. The
+; glyphs for these are still 4x5, but the 6th row of pixels for all 5
+; get stored together in the last glyph in the set (ASCII code $7F,
+; which should be considered an unprintable character).
+
+ processor 6502 ; DASM-specific
+
+; ----------------------------------------------------------------------------
+ include equates.inc
+
+; "backdoor" vectors into the S: and K: ROM drivers. These are addres-minus-1,
+; called by PHA/PHA/RTS.
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+
+; ----------------------------------------------------------------------------
+; Constants
+
+LAST_ROW = $1F ; last valid cursor row on screen, 31 decimal (we count from 0)
+EOL = $9B ; Atari ASCII end-of-line (aka the Return key)
+INVERTED_MASK = $F8 ; stored in inverse_mask when rendering in inverse video
+
+; ----------------------------------------------------------------------------
+; Defaults
+
+DEFAULT_TEXT_COLOR = $00
+DEFAULT_BG_COLOR = $C8
+DEFAULT_RMARGN = $3F
+
+; ----------------------------------------------------------------------------
+; ZP storage
+; Reuse some of the E:/S: devices' storage
+; These all get recalculated on col64_putbyte entry,
+; so it's probably OK to mix with GR.8 PLOT/DRAWTO stuff
+
+ seg.u "data"
+ org $A0 ; (used to be $90 aka OLDROW)
+mask_lo ds 1 ; Holds the 16-bit mask, used by render_glyph
+mask_hi ds 1
+screen_ptr_lo ds 1 ; Pointer to display RAM: render_glyph and scroll_screen
+screen_ptr_hi ds 1 ; both use this.
+font_index ds 1 ; index into font: TMPCHR * 5
+shift_amount ds 1 ; How many times to right-shift during render_glyph
+
+ ;org $63 ; aka LOGCOL
+glyph_data_lo ds 1 ; render_glyph stores (possibly shifted) glyph data
+glyph_data_hi ds 1 ; here. Also a 2nd display RAM pointer in scroll_screen
+lo_nybble_flag ds 1 ; non-zero if glyph data in top 4 bits of font
+
+ ;org $68 ; aka SAVADR
+inverse_mask ds 1 ; 0 for normal video, INVERTED_MASK for inverse
+line_buffer_index ds 1 ; used by col64_getbyte
+descender ds 1 ; offset-1 of true descender byte, into font_data
+
+; We also use several other ZP locations, normally used by the OS E: driver:
+; COLCRS ROWCRS TMPCHR BUFCNT RMARGN SAVMSC are used for the same purpose as
+; the OS uses them for.
+
+; ----------------------------------------------------------------------------
+; Non-ZP storage (cassette buffer for now)
+
+ org CASBUF
+line_buffer ds $80
+
+ seg "code"
+; ----------------------------------------------------------------------------
+; XEX segment header
+
+;START_ADDRESS_1 = $9C78
+START_ADDRESS_1 = $9C00 ; should end at $A036; subtract 2K to use with BASIC
+ org START_ADDRESS_1-6
+
+ word $FFFF
+ word START_ADDRESS_1
+ word END_ADDR_1
+
+; ----------------------------------------------------------------------------
+; Font data should be aligned on a page boundary
+; (for speed; still works unaligned). Each 5 bytes stores 2 glyphs
+; side-by-side. When rendering into 5x6 cells, the bottom line and
+; the left column are set to all 0 (or all 1 for inverse video) for padding,
+; so the glyphs can take up the entire 4x5 space.
+; Only character codes 32 through 127 are supported; this is 96
+; characters. At 2 glyphs per 5 bytes, that's 96/2*5=240 bytes,
+; which means the whole font fits into one page and can be
+; accessed with X or Y indexed mode rather than (indirect),Y.
+
+font_data:
+ ;include font4x5.inc
+ include col64_ext.inc
+
+DESCENDERS = $EB ; g j p q y descender bytes, offset from font_data
+
+; ----------------------------------------------------------------------------
+; Mask tables, used by setup_mask. Indexed by (COLCRS % 8), since they
+; would repeat every 8 bytes anyway. Each mask is 16 bits, and contains
+; a 1 for each pixel in screen RAM that we *don't* want to change when
+; writing pixels (because they're not part of the current character cell),
+; but see below...
+
+mask_lo_tab:
+ byte $07, $F8, $C1, $FE, $F0, $83, $FC, $E0
+
+; In mask_hi_tab, $00 is never a valid mask, while $FF means "don't touch any
+; bits in 2nd byte". As a minor optimization, $00 appears in the table in
+; place of $FF. This allows us to just test the Z flag after loading the mask
+; hi byte, instead of needing to compare against $FF.
+; (Actually, on further thought, the $FF's could have been left in, and the
+; test could have been made on the N flag: any hi mask with bit 7 set won't have
+; any other bits clear. *Shrug*)
+
+mask_hi_tab:
+ byte $00, $3F, $00, $0F, $7F, $00, $1F, $00
+
+; ----------------------------------------------------------------------------
+; Indexed by COLCRS%8, how many bits to shift the font data right
+; The mask_*_tab stuff above could be calculated at runtime from this,
+; the tables are only there for speed.
+
+shift_amount_tab:
+ byte $00, $05, $02, $07, $04, $01, $06, $03
+
+; ----------------------------------------------------------------------------
+; Line address tables, used by setup_screen_ptr. Indexed by ROWCRS. Used by
+; setup_screen_ptr
+
+line_addr_tab_lo:
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+
+line_addr_tab_hi:
+ byte $00, $00, $01, $02, $03, $04, $05, $06
+ byte $07, $08, $09, $0a, $0b, $0c, $0d, $0e
+ byte $0f, $0f, $10, $11, $12, $13, $14, $15
+ byte $16, $17, $18, $19, $1a, $1b, $1c, $1d
+
+; ----------------------------------------------------------------------------
+; Byte offset within scanline, indexed by COLCRS & $1F value
+; Used by setup_screen_ptr.
+
+column_byte_tab:
+ byte $00, $00, $01, $01, $02, $03, $03, $04
+ byte $05, $05, $06, $06, $07, $08, $08, $09
+ byte $0A, $0A, $0B, $0B, $0C, $0D, $0D, $0E
+ byte $0F, $0F, $10, $10, $11, $12, $12, $13
+
+; Used to be indexed by COLCRS, rest of the table was:
+ ;byte $14, $14, $15, $15, $16, $17, $17, $18
+ ;byte $19, $19, $1A, $1A, $1B, $1C, $1C, $1D
+ ;byte $1E, $1E, $1F, $1F, $20, $21, $21, $22
+ ;byte $23, $23, $24, $24, $25, $26, $26, $27
+
+; ----------------------------------------------------------------------------
+; Handler table (HATABS will point to this).
+; See the HATABS and EDITRV entries in Mapping the Atari for details.
+
+col64_vector_tab:
+ word col64_open-1 ; OPEN vector
+ word col64_close-1 ; CLOSE vector
+ word col64_getbyte-1 ; GET BYTE vector
+ word col64_putbyte-1 ; PUT BYTE vector
+ word col64_close-1 ; GET STATUS vector
+ word col64_close-1 ; SPECIAL vector
+ ;jmp col64_init ; Jump to initialization code (JMP LSB/MSB)
+ ; (Note: the OS really only ever calls the JMP init
+ ; routines for handlers in ROM, this could be empty)
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08 ; graphics mode 8
+ sta ICAX2Z
+ lda #$0C ; R/W access
+ sta ICAX1Z
+ jsr open_s_dev
+
+ ; Set default colors
+ lda #DEFAULT_BG_COLOR
+ sta COLOR2
+ sta COLOR4
+ lda #DEFAULT_TEXT_COLOR
+ sta COLOR1
+
+ ; Protect ourselves from the OS
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ rts
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi
+ pha
+ lda s_dev_open_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL64 maintains a line buffer. Each time col64_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is not exactly how the OS E: device works: it reads keystrokes but
+; doesn't buffer them, until Return is hit; then it reads from screen
+; memory, at the current cursor line (and the line(s) before/after,
+; depending on its map of logical => physical lines). We can't do that
+; because we don't store character codes in screen memory... although
+; we *could* support insert/delete character, delete-line, and left/right
+; arrows. We don't, to save driver code size...
+
+; This code was borrowed from COL80, then big chunks of it were diked out
+; and/or optimized.
+
+col64_getbyte:
+ lda BUFCNT
+ beq get_line ; See if there are bytes left in the buffer
+
+get_next_byte: ; Yes: return next byte from the buffer
+ ldx line_buffer_index
+ lda line_buffer,x
+ dec BUFCNT
+ inc line_buffer_index
+ jmp return_success
+
+; Buffer is empty.
+; Get a line of input from the user, terminated by the Return key.
+get_line:
+ lda #$00
+ sta BUFCNT
+ sta line_buffer_index
+
+show_cursor:
+ jsr print_inv_space
+ jsr get_keystroke
+
+; code meant to deal with BREAK key, left out 'cause FujiChat disables BREAK
+; cpy #$01
+; beq keystroke_ok
+; ldy #0
+; sty line_buffer_index
+; sty BUFCNT
+
+keystroke_ok:
+ cmp #$20
+ bcc show_cursor ; ignore low ASCII
+ cmp #EOL
+ beq return_key_hit
+
+check_backs_key:
+ cmp #$7E
+ beq backs_key_hit
+
+;check_clear_key: ; don't bother, don't need
+ ; (if we did want this, it should check delete-line instead!)
+ ;;cmp #$7D
+ ;;beq clear_key_hit
+
+normal_key_hit:
+ ldx BUFCNT
+ bmi show_cursor
+
+buffer_character:
+ sta line_buffer,x
+ jsr col64_putbyte
+ inc BUFCNT
+ bne show_cursor
+
+return_key_hit:
+ jsr print_space
+ lda #EOL
+ ldx BUFCNT
+ sta line_buffer,x
+ inc BUFCNT
+ jsr col64_putbyte
+ bne get_next_byte ; col64_putbyte always clears Z flag!
+
+;;clear_key_hit:
+; jsr clear_screen ; if we implemented it...
+;; lda #$00
+;; sta line_buffer_index
+;; sta BUFCNT
+;; beq get_line
+
+backs_key_hit:
+ jsr print_space
+ lda BUFCNT
+ beq backs_key_done
+ dec COLCRS
+ lda COLCRS
+ clc
+ adc #$01
+ cmp LMARGN
+ bne backs_same_line
+ lda RMARGN
+ sta COLCRS
+ dec ROWCRS
+
+backs_same_line:
+ dec BUFCNT
+
+backs_key_done:
+ jmp show_cursor
+
+; ----------------------------------------------------------------------------
+; Print a space or inverse space character at the current cursor position.
+; Does not update the cursor position.
+
+print_inv_space:
+ lda #INVERTED_MASK
+ byte $2C
+
+print_space:
+ lda #$00
+ sta inverse_mask
+ lda #$00
+ sta TMPCHR
+ jmp render_glyph
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+
+get_keystroke:
+ lda k_dev_get_hi
+ pha
+ lda k_dev_get_lo
+ pha
+ ;rts ; fall through to return_success
+
+
+; ----------------------------------------------------------------------------
+; Unimplemented CIO callbacks here. Also various other routines jump here
+; to return success to the caller.
+
+col64_close:
+return_success:
+ ldy #$01
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO OPEN command callback
+
+col64_open:
+ jsr init_graphics_8
+ lda #$00
+ sta ROWCRS
+ sta COLCRS
+ sta BUFCNT
+ sta LMARGN
+ lda #DEFAULT_RMARGN
+ sta RMARGN
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO PUT BYTE command callback
+; The byte to put is passed to us in the accumulator.
+
+col64_putbyte:
+ ; EOL (decimal 155)?
+ cmp #EOL
+;;; bne check_clear
+ bne regular_char
+ lda RMARGN
+ sta COLCRS
+ jmp skip_write
+
+;;;check_clear:
+;;; ; save memory by not including clear_screen
+;;; ; (also, this lets us print the } character)
+;;; ; Clear (decimal 125)?
+;;; cmp #$7D
+;;; bne regular_char
+;;; jmp clear_screen
+;;; .endif
+;;;
+
+; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax
+ bpl not_inverse
+ lda #INVERTED_MASK
+ .byte $2C ; aka BIT abs, skip the LDA
+not_inverse:
+ lda #$00
+ sta inverse_mask
+
+ txa
+ and #$7F
+ sec
+ sbc #$20 ; subtract $20 because we only handle codes $20 to $7F
+ bcs not_low_ascii
+ jmp return_success ; ignore any chr codes $00-$1F or $80-$9F
+
+not_low_ascii:
+ sta TMPCHR
+
+ lda DINDEX ; OS stores current graphics mode here
+ cmp #$08
+ beq graphics_ok
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col64_open
+
+graphics_ok:
+ jsr render_glyph
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor
+
+; Could implement SSFLAG logic here
+;check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ ;lda SSFLAG
+ ;bne check_ssflag
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Call the routines that actually print the character.
+; render_glyph prints the character in TMPCHR at the current
+; COLCRS and ROWCRS, and does NOT advance the cursor.
+; TMPCHR should already have bit 7 stripped; render_glyph will
+; use inverse_mask, so the caller should have set that up as well.
+
+; Note: The 4 subroutines were only ever called from render_glyph,
+; so to save a tiny bit of time and space, they're now inline code.
+
+render_glyph:
+ ;jsr setup_mask
+ ;jsr setup_screen_ptr
+ ;jsr setup_font_index
+ ;jmp write_font_data
+
+; ----------------------------------------------------------------------------
+; mask is used to avoid overwriting pixels outside the character cell
+; we're currently writing. Since 5 pixel wide cells don't align on byte
+; boundaries in screen RAM, we have to read/modify/write 2 bytes, and
+; the mask also has to be 2 bytes wide.
+; Also we set up shift_amount here.
+
+setup_mask:
+ lda COLCRS
+ and #$07
+ tax
+ lda mask_lo_tab,x
+ sta mask_lo
+ lda mask_hi_tab,x
+ sta mask_hi
+ lda shift_amount_tab,x
+ sta shift_amount
+ ;rts
+
+
+; ----------------------------------------------------------------------------
+; Make (screen_ptr_lo) point to the first byte of screen RAM on the top line
+; of the current char cell. Assumes COLCRS/ROWCRS are never out of range!
+setup_screen_ptr:
+ ; first the row... table lookup quicker than mult by 240
+ ldx ROWCRS ; +3 = 3
+ clc ; +2 = 5
+ lda SAVMSC ; +3 = 8
+ adc line_addr_tab_lo,x ; +4 = 12
+ sta screen_ptr_lo ; +3 = 15
+ lda SAVMSC+1 ; +3 = 18
+ adc line_addr_tab_hi,x ; +4 = 22
+ sta screen_ptr_hi ; +3 = 25
+
+ ; now do the column. column_byte_tab is only a half-table, so do lookup
+ ; on bits 0-4 of COLCRS, then add 20 decimal if bit 5 of COLCRS was set.
+ lda COLCRS
+ tay
+ and #$1F
+ tax
+ lda column_byte_tab,x
+ cpy #$20
+ bcc ssp_noadd
+ adc #$13 ; +1 because C set = 20 dec
+
+ssp_noadd:
+ clc
+ adc screen_ptr_lo
+ sta screen_ptr_lo
+ lda #0
+ adc screen_ptr_hi
+ sta screen_ptr_hi
+
+ ;rts
+
+; ----------------------------------------------------------------------------
+; Set up font_index to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+; Calculation is:
+; lo_nybble_flag = (TMPCHR & 1) ? $FF : $00;
+; font_index = (TMPCHR >> 1) * 5;
+
+setup_font_index:
+ lda #$00
+ sta lo_nybble_flag
+ lda TMPCHR
+ lsr ; a = (TMPCHR >> 1)
+ tay ; y = a
+ bcc font_hi_nybble
+ dec lo_nybble_flag ; = $FF
+
+font_hi_nybble:
+ clc
+ asl ; a *= 2
+ asl ; a *= 2
+ sta font_index
+ tya
+ adc font_index
+ sta font_index
+
+ ; rts
+
+
+; ----------------------------------------------------------------------------
+; True descender support: we've got a hard-coded list of 5 characters
+; (g j p q y) that have them. All the descender graphics are stored in the
+; bottom nybble of the last glyph in the font, which means we can only have
+; 5 characters that have descenders.
+; TODO: tighten up this code some (faster/smaller)
+
+ lda TMPCHR
+ ldx #$FF
+
+ cmp #'g-$20
+ bne chk_j
+ ldx #DESCENDERS-1
+chk_j:
+ cmp #'j-$20
+ bne chk_p
+ ldx #DESCENDERS
+chk_p:
+ cmp #'p-$20
+ bne chk_q
+ ldx #DESCENDERS+1
+chk_q:
+ cmp #'q-$20
+ bne chk_y
+ ldx #DESCENDERS+2
+chk_y:
+ cmp #'y-$20
+ bne not_y
+ ldx #DESCENDERS+3
+
+not_y:
+ stx descender
+
+; ----------------------------------------------------------------------------
+; When write_font_data is called, all this stuff must be set up:
+; - font_index is the 1-byte index into font_data where the current glyph is
+; - lo_nybble_flag is 0 for high nybble of glyph data, $FF for low
+; - mask_lo/hi is our 16-bit pixel mask (1's are "leave original data")
+; - shift_amount is # of times to shift glyph data right
+; - screen_ptr_lo/hi points to the 1st byte on the top line
+; - inverse_mask is 0 for normal or INVERTED_MASK for inverse
+; - descender is the offset *minus one* of the byte holding the bottom 4
+; pixels in the 4x6 character. Most of the time this will be $FF,
+; AKA the the offset from font_data of the first byte of the space glyph
+; (minus one), which has 0000 in its top nybble. The rest of the time,
+; the descenders are taken from the bottom nybble of the last character
+; glyph (which would be the unprintable code $7F). The logic that does
+; the descenders is hard-coded to use the top nybble for $FF and the
+; bottom nybble for anything else.
+
+; Loop 5 times, each time thru the loop:
+; - extract 4-bit glyph data, store in glyph_data_lo
+; - apply inverse_mask
+; - shift right shift_amount times
+; ...write data...
+; - add 40 to 16-bit screen_ptr_lo/hi (to get to next line)
+; ...then one more loop with font_index and lo_nybble_flag set
+; to a byte in the space glyph, to handle the bottom row (which
+; is always 0 for normal or all 1's for inverse)
+
+write_font_data:
+ ldx #$05 ; outer loop counter, aye
+
+wfont_line_loop:
+ lda #$00
+ sta glyph_data_hi
+
+ ldy font_index
+ lda font_data,y ; note: entire font must fit in one page!
+
+ bit lo_nybble_flag
+ beq use_hi_nybble
+
+ asl ; the pixels we want are in the low nybble of the font data byte.
+ asl ; shift them up to the top nybble
+ asl
+ asl
+
+use_hi_nybble: ; 4-bit glyph data now in hi nybble
+ and #$F0
+ eor inverse_mask
+ sta glyph_data_lo
+
+ ldy shift_amount
+ beq wfont_no_shift
+
+wfont_shift_loop: ; right-shift 16-bit glyph data shift_amount times
+ lsr glyph_data_lo
+ ror glyph_data_hi
+ dey
+ bne wfont_shift_loop
+
+wfont_no_shift: ; Y always zero when we get here
+ lda mask_lo
+ and (screen_ptr_lo),y
+ ora glyph_data_lo
+ sta (screen_ptr_lo),y
+
+ lda mask_hi
+ beq wfont_skip_hi ; don't bother with 2nd screen byte if we don't need to
+ iny
+ and (screen_ptr_lo),y
+ ora glyph_data_hi
+ sta (screen_ptr_lo),y
+
+wfont_skip_hi:
+ dex
+ bmi wfont_done
+ bne wfont_not_bottom
+
+ ;stx font_index
+ ;stx lo_nybble_flag
+
+; X always 0 here: for last line, use the descender (if there's no
+; descender for this char, that's $FF. font_index will get inc'ed,
+; meaning non-decender chars use the first byte of the space glyph
+; as their "descender")
+ lda descender
+ sta font_index
+ cmp #$FF
+ beq wfont_not_bottom
+ sta lo_nybble_flag
+
+wfont_not_bottom:
+ lda #$28 ; add 40 bytes to point to next line of screen RAM
+ clc
+ adc screen_ptr_lo
+ sta screen_ptr_lo
+ bcc wfont_noinc
+ inc screen_ptr_hi
+
+wfont_noinc:
+ inc font_index
+ bne wfont_line_loop ; branch always
+
+wfont_done:
+ rts
+
+; ----------------------------------------------------------------------------
+; Not the fastest scroller in the west... TODO: make faster :)
+
+; lda_operand points to line N (minus one byte)
+; sta_operand points to line N+1 (minus one byte)
+; Y ranges 240 to 1 in the loop, hence the -1 byte
+; CAUTION: Self-modifying code! Proceed with caution.
+
+; This version gives us overall driver speed almost 20% faster
+; than the original scroll_screen (last commented-out one below)
+; Also just scrolling 250 times is slightly faster than COL80
+; (1505 jiffies; setting CRITIC saves 48 jiffies)
+; (makes it 17% the speed of the OS E: driver, where COL80 is 15%)
+; Note that E80 is slightly over twice as fast at this as the OS!
+
+; Note about performance where scrolling is *not* concerned:
+; Printing 914 non-control characters on a freshly-cleared screen:
+; OS E: - 172 jiffies (subtract 12 = 160 jiffies if cursor disabled)
+; E80 - 168 jiffies (about same as OS E:)
+; COL80 - 116 jiffies (yes, it's fastest!)
+; CON64 from SDX 4.41 - 227 jiffies first time I tried, crashed next time!
+; COL64 - 142 jiffies (still faster than OS E:)
+
+scroll_screen:
+; lda SDMCTL
+; pha
+; lda #0
+; sta SDMCTL
+
+; lda CRITIC
+; pha
+; lda #1
+; sta CRITIC
+
+ lda SAVMSC
+ sec
+ sbc #1
+ sta lda_operand
+ lda SAVMSC+1
+ sbc #0
+ sta lda_operand+1
+ ldx #LAST_ROW
+
+scroll_line_loop:
+ ldy #$F0
+
+ lda lda_operand+1
+ sta sta_operand+1
+ lda lda_operand
+ sta sta_operand
+ clc
+ adc #$F0
+ sta lda_operand
+ bcc ss_noinc
+ inc lda_operand+1
+ss_noinc:
+
+scroll_byte_loop:
+lda_operand = *+1
+ lda 0,y
+sta_operand = *+1
+ sta 0,y
+ dey
+ bne scroll_byte_loop
+ dex
+ bne scroll_line_loop
+
+scroll_blank:
+ lda lda_operand
+ sta sta2_operand
+ lda lda_operand+1
+ sta sta2_operand+1
+ lda #0
+ ldy #$F0
+sblank_loop:
+sta2_operand = *+1
+ sta 0,y
+ dey
+ bne sblank_loop
+
+; pla
+; sta SDMCTL
+; pla
+; sta CRITIC
+ rts
+
+;; This version is faster and fully functional
+;; (overall driver speed is 10% faster than with the
+;; one below)
+; glyph_data_lo points to line N (minus one byte)
+; screen_ptr_lo points to line N+1 (minus one byte)
+; Y ranges 240 to 1 in the loop, hence the -1 byte
+
+;;scroll_screen:
+;; lda SAVMSC
+;; sec
+;; sbc #1
+;; sta screen_ptr_lo
+;; lda SAVMSC+1
+;; sbc #0
+;; sta screen_ptr_hi
+;; ldx #LAST_ROW
+;;
+;;scroll_line_loop:
+;; ldy #$F0
+;;
+;; lda screen_ptr_hi
+;; sta glyph_data_hi
+;; lda screen_ptr_lo
+;; sta glyph_data_lo
+;; clc
+;; adc #$F0
+;; sta screen_ptr_lo
+;; bcc ss_noinc
+;; inc screen_ptr_hi
+;;ss_noinc:
+;;
+;;scroll_byte_loop:
+;; lda (screen_ptr_lo),y
+;; sta (glyph_data_lo),y
+;; dey
+;; bne scroll_byte_loop
+;; dex
+;; bne scroll_line_loop
+;;
+;;scroll_blank:
+;; lda #0
+;; ldy #$F0
+;;sblank_loop:
+;; sta (screen_ptr_lo),y
+;; dey
+;; bne sblank_loop
+;;
+;; rts
+
+; Clock cycle timings:
+; 1792080 CPU cycles per second (or is it 1789773?)
+; 29868 per jiffy on NTSC (1/60 sec)
+; DL = 174 bytes @ 1 cycle each
+; Screen RAM = 7680 bytes @ 1 ea
+; Refresh = 262 * 9 = 2358
+; so ANTIC steals 10212 (34.2%) cycles, leaves 19656 (65.8%)
+; Of that time, the OS steals some doing VBLANK processing.
+; It may be that I can set CRITIC here and get a little of
+; that back (depends on what, if anything, that does to
+; the RS232 driver and/or custom keybuffer stuff in FujiChat).
+
+; Now if I could actually do a 100% unrolled scroller, simply
+; LDA blah:STA blah-1 7680 times, with NMI/VBI/ANTIC disabled,
+; that would be 4+4=8 cycles times 7680 = 61440, or 3.12 frames
+; (or 0.052 sec, call it 1/20 sec). Obviously can't do it that way.
+
+; Did some tests of overall performance (not just scrolling: print
+; 24 lines of 35 chars, then 24 newlines, repeat in a loop 10x)
+; Turning off ANTIC DMA seems to save 25% time. Setting CRITIC only
+; saves 3% or so. Disabling IRQs/NMIs entirely is probably not an
+; option.
+
+;; old (slower, but working) version:
+;; scroll_screen:
+;; lda #0 ; +2 = 2
+;; sta COLCRS ; +3 = 5
+;; sta ROWCRS ; +3 = 8
+;; jsr setup_screen_ptr ; +6 = 14, +54 = 68
+;;
+;; scroll_line_loop:
+;; lda screen_ptr_lo ; +3 = 3
+;; sta glyph_data_lo ; +3 = 6
+;; lda screen_ptr_hi ; +3 = 12
+;; sta glyph_data_hi ; +3 = 15
+;; ldx ROWCRS ; +3 = 18
+;; cpx #LAST_ROW ; +2 = 20
+;; beq scroll_blank ; +2 = 22 (+1 more last time thru)
+;; inx ; +2 = 24
+;; stx ROWCRS ; +3 = 27
+;; jsr setup_screen_ptr ; +6+54 = 87
+;; ldy #0 ; +2 = 89
+;; ; times 31 is 2759, +1 = 2760
+;;
+;; scroll_byte_loop:
+;; lda (screen_ptr_lo),y ; +5 = 5
+;; sta (glyph_data_lo),y ; +6 = 11
+;; iny ; +2 = 13
+;; cpy #$F0 ; +2 = 15
+;; bne scroll_byte_loop ; +3 = 18 (-1 last time thru)
+;; ; ...times 31 times 240 - 1 = 133919 (!)
+;; beq scroll_line_loop ; +3*31-1 (92)
+;;
+;; scroll_blank:
+;; jsr setup_screen_ptr ; +6+54 = 60
+;; ldy #0 ; +2 = 62
+;; tya ; +2 = 64
+;; sblank_loop:
+;; sta (screen_ptr_lo),y ; +6 = 6
+;; iny ; +2 = 8
+;; cpy #$F0 ; +2 = 10
+;; bne sblank_loop ; +3 = 13 (-1 last time)
+;; ; times 240, minus 1 = 3119
+;;
+;; rts ; +6
+;;
+;; Total routine time is 68 + 2760 + 133919 + 92 + 64 + 3119 + 6 = 140028
+;; Divide by free cyc/frame: 140028/19656 = 7.12 frames, or 0.11 sec,
+;; not counting VBLANK overhead. 95% of the time is of course in the
+;; inner loop. Every cycle saved in the inner loop is worth about
+;; 5% of the runtime! So switching from incrementing to decrementing
+;; Y will save 10% of the time (from not having the CPY). Using self-
+;; modifying code for the lda/sta saves 2 more cycles (10% more), but
+;; adds a small bit of overhead in the outer loop.
+;; The scroll_blank loop is only 2.2% of the total time. Every cycle
+;; shaved off its loop is worth only 1/3 of a percent of the total
+;; time (switching to dey is worth 2/3 of 1%).
+;; Replace jsr setup_screen_ptr in scroll_line_loop with loading from
+;; the tables directly will save approx. 35 cycles per outer loop,
+;; or only about 0.8%.
+;; So total savings is 20% + 0.6% + 0.8% = 21.4%, meaning real time
+;; drops to approx 0.085 sec, or approx 5.5 NTSC frames (another way
+;; to look at it: 11.75 scrolled lines/sec instead of the original 9)
+;; Yet another way: 2 1/3 seconds to scroll the whole screen, vs
+;; the original 3 1/2. Still abysmal.
+
+;; One possibility would be to borrow a page from the ACE-80 book and
+;; update LMSes within the DL. This would bloat the display list by
+;; 64 bytes (not so bad). We'd basically treat screen RAM as a circular
+;; buffer of 32 lines. Every scroll, update the LMS operands to point
+;; to the next line-buffer, and whichever buffer is the last visible
+;; line needs to be blanked. Got to see how much code this will add
+;; (possibly the routine that does this might not be longer than the
+;; scroll_screen I've been using). ACE-80 (or anyway E80) uses way
+;; more screen RAM than it looks like it needs, plus DLIs.
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS
+ lda RMARGN
+ cmp COLCRS
+ bcs same_line
+ lda LMARGN
+ sta COLCRS
+ lda ROWCRS
+ cmp #LAST_ROW
+ bcc no_scroll
+ jsr scroll_screen
+ ; Move to last row after scrolling
+ lda #LAST_ROW-1
+ sta ROWCRS
+
+no_scroll:
+ inc ROWCRS
+
+same_line:
+ rts
+
+END_ADDR_1 = *-1
+
+
+; ----------------------------------------------------------------------------
+; Initialization. If we don't want the handler to survive a warmstart, we
+; can load this bit into e.g. the cassette buffer (throw away after running)
+
+START_ADDRESS_2 = CASBUF
+
+; XEX segment header for throwaway init code
+ rorg START_ADDRESS_2-4
+ word START_ADDRESS_2
+ word END_ADDR_2
+
+col64_init:
+ ldy #$00
+
+next_hatab_slot:
+ lda HATABS,y
+ beq register_x_handler
+ iny
+ iny
+ iny
+ cpy #$20
+ bcc next_hatab_slot
+ jmp return_success
+
+register_x_handler:
+ lda #$58
+ sta HATABS,y
+ lda #<col64_vector_tab
+ iny
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+ jmp return_success
+
+main_entry_point:
+ jsr col64_init
+ lda #$0C
+ sta ICCOM
+ ldx #$00
+ jsr CIOV
+ lda #$58
+ sta font_index
+ lda #$03
+ sta ICCOM
+ lda #font_index
+ sta ICBAL
+ lda #$00
+ sta ICBAH
+ ldx #$00
+ jsr CIOV
+ ldy #$07
+ lda #<col64_vector_tab
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+no_e_handler:
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ jmp return_success
+
+END_ADDR_2 = *-1
+
+; XEX segment (run address)
+ word INITAD
+ word INITAD+1
+ word main_entry_point
+
+; That's all, folks...
+
+; Rest of file is me rambling & meandering, ignore or not as you choose
+
+; Possible improvements, some of which may apply to this driver only,
+; some of which may apply to a (to be written) 40-column renderer.
+; Redb3ard has designed really nice 8x8 normal, bold, italic fonts,
+; including a bunch of Unicode normal characters... the 40-column
+; driver would include UTF-8 support. Of course there's not enough
+; RAM for an IRC client, TCP/IP stack, screen/DL memory, driver,
+; UTF-8 tables, and 3 or 4 fonts... will have to wait until after
+; the 1.0 FujiChat release (my roadmap for 1.0 is that everything
+; needs to work on a 48K unmodded 800; 2.0 will have new features
+; that may only work on an XL or even require 130XE banks, though
+; it will still be as functional as 1.0, on an 800).
+
+; True descenders and 5-bit-wide characters.
+
+; For descenders, could simply leave the top row of pixels blank on
+; the screen, and draw the 5 rows of character in the bottom 5 of
+; the 6-scanline block. They'd possibly touch the character on the
+; next line...
+
+; 5-bit-wide characters should be used sparingly: only M W m w T
+; and maybe Y V v # need them. The "extra" bit could go on the left,
+; and just be a copy of the rightmost bit, since these characters
+; are symmetrical... but these would often touch the character on
+; the left. Capital letters, it's less of a big deal in normal English
+; text, since a capital letter should be preceded by a space (or at
+; least punctuation), and it won't touch the character on the right
+; unless it's another 5-bit-wide one (few words in English are going
+; to have that problem; maybe the name AMY in all caps). Unfortunately
+; I can't think of a good way to encode the bits of information that
+; say a character needs the extra pixel (or a descender either) other
+; than a hard-coded set of compares against specific char codes, or
+; else a loop over a table of them. Either way there's a loss of
+; performance: most characters will fail all the compares...
+; It'd be possible to do a 5x5 font, or even 5x6, but 5 bits wide
+; means we can't pack the pixel data 2 rows per byte (so the
+; font won't fit in a page any more, plus we have to use (zp),y
+; or something to access it...)
+
+; Multiple font support. Since it's an IRC-specific driver, could just
+; have _putbyte directly interpret the IRC protocol formatting codes,
+; render e.g. bold as inverse, italic as underline if I implement it,
+; or else do up a separate italic font (if it's possible to make one
+; look good in 4x5). _putbyte could at least strip out the codes it
+; can't render (e.g. color).
+
+; I've thought of doing underline (either a separate mode, or instead
+; of inverse video), but a lot of the glyphs will look like crap with
+; the underline, because there's no room for spacing: the underline
+; will touch the bottom pixels of most characters (and overwrite the
+; descenders if we add true descender support...)
+
+; Obviously, making it a fully-functional E: replacement would be nice.
+; I'm not doing this because I'm only wanting to use the driver for
+; text-only cc65 programs (specifically FujiChat), though possibly
+; I'll come back to col64 and do a proper version later.
+
+; Also nice: user-adjustable number of rows. Most peoples' monitors can
+; display something above 200 scanlines (particularly if they're in PAL
+; countries). As-is, we're using 192 scanlines to get 32 rows (of 6 lines
+; each). Most people could easily display 34 rows (204 scanlines), and
+; not a few could display 35 (210), particularly if the blanking
+; instructions at the start of the display list are user-adjustable too
+; (to move the picture up or down). Memory usage for video RAM would
+; grow by 240 byte per row of characters, and of course we'd need code
+; to set up the custom display list (which would be longer than a
+; normal one for GR.8). Probably would put a limit of 36 or 40 rows
+; since the various tables are fixed-size...
+
+; If there were RAM enough for it, or if we decide to use XE extra
+; banks (or XL/XE under-OS RAM), could have _putbyte also store
+; every output character in a buffer, for FujiChat to use as
+; scrollback/log buffer (or any other program to use as it sees
+; fit, of course).
+
+; User-loadable font isn't a bad idea: the init code can look for a
+; file D:COL64.FNT and load it into font_data if found.
+
+; Could implement standard ASCII backspace/tab/linefeed/CR/etc codes,
+; using low ASCII codes. This would be suitable for a telnet or terminal
+; client (not needed for IRC)
+
+; I really would like to do auto-relocation. Program could load itself
+; wherever, and relocate itself (using a table of offsets, for absolute
+; addresses within the program) to either MEMLO or MEMTOP. This would
+; mean more init code only.
+
+; It'd be nice to speed up scrolling. One dumb trick would be to use
+; self-modifying code: instead of (zp),y addressing, use abs,y
+; in the inner loop, and the outer loop modifies the operands in
+; the inner. Would mean the code can't be burned to ROM, but who
+; was planning to do that anyway? Also simply moving more than one
+; chunk per outer-loop iteration would be a small speedup, and so
+; would moving 256 bytes per, instead of 240.
+; Since the inner loop does lda (zp),y [5+cyc] and sta (zp),y [6cyc]
+; 7440 times, replacing them with lda abs,y [4+cyc] and sta abs,y
+; [5cyc] should save 7440*2 = almost 15K cycles.
+; which may not be noticeable... Unrolling the loop is even less of a
+; gain: the outer loop only runs 32 times. Could set CRITIC during the
+; move (not sure that helps much). No matter how you slice it,
+; moving 8K on a 6502 is *slow*.
+
+; One slightly cool idea would be to do a proper OPEN of channel #6
+; to S:, like the BASIC GR. command does, instead of the "shortcut"
+; using ZIOCB and calling the S: open routine directly. Doing this
+; would allow PLOT, DRAWTO, and XIO 18 (fill).
diff --git a/src/col64/cruft/col64.dasm.works b/src/col64/cruft/col64.dasm.works
new file mode 100644
index 0000000..1e02921
--- /dev/null
+++ b/src/col64/cruft/col64.dasm.works
@@ -0,0 +1,731 @@
+
+; ----------------------------------------------------------------------------
+; 64x32 software text driver
+; Uses 4x5 font in 5x6 character cells
+; Based on disassembled COL80 driver
+
+; This driver is missing quite a few things a full E: driver should have:
+
+; - No support for cursor controls, insert/delete, or even clear screen
+; (instead the control-codes are printed as normal characters, if they're
+; above 31 decimal)
+
+; - No support for low ASCII at all: any attempt to input or print a character
+; in the range 0-31 decimal is just ignored (this includes the arrow keys)
+
+; - Does not attempt to survive a warmstart
+
+; - Will fail disastrously if an application sets COLCRS/ROWCRS to any
+; out-of-range values
+
+; - Only displays the cursor during get-byte operations
+
+; - Backspace key is supported during get-byte, but printing a backspace
+; with put-byte prints a tilde instead
+
+; On the other hand, this driver is tiny, and plays nice with cc65's stdio
+; support (though NOT conio!)
+
+ processor 6502 ; DASM-specific
+
+; ----------------------------------------------------------------------------
+ include equates.inc
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+
+; ----------------------------------------------------------------------------
+; Constants
+
+LAST_ROW = $1F
+EOL = $9B
+INVERTED_MASK = $F8
+
+; ----------------------------------------------------------------------------
+; Defaults
+
+DEFAULT_TEXT_COLOR = $00
+DEFAULT_BG_COLOR = $08
+;DEFAULT_LMARGN = $00 ; not used
+DEFAULT_RMARGN = $3F
+
+; ----------------------------------------------------------------------------
+; ZP storage
+; Reuse some of the E:/S: devices' storage
+; These all get recalculated on col64_putbyte entry,
+; so it's OK to mix with GR.8 PLOT/DRAWTO stuff
+
+ seg.u "data"
+ org $5A ; aka OLDROW
+mask_lo ds 1
+mask_hi ds 1
+screen_ptr_lo ds 1
+screen_ptr_hi ds 1
+font_index ds 1
+shift_amount ds 1
+line_count ds 1
+glyph_data_lo ds 1
+glyph_data_hi ds 1
+
+; ----------------------------------------------------------------------------
+; Non-ZP storage (cassette buffer for now)
+
+ org CASBUF
+lo_nybble_flag ds 1
+inverse_mask ds 1
+line_buffer_index ds 1
+line_buffer ds $80
+
+ seg "code"
+; ----------------------------------------------------------------------------
+; XEX segment header
+START_ADDRESS_1 = $9A00
+ org START_ADDRESS_1-6
+
+ word $FFFF
+ word START_ADDRESS_1
+ word END_ADDR_1
+
+; ----------------------------------------------------------------------------
+; Font data should be aligned on a page boundary
+; (for speed; still works unaligned). Each 5 bytes stores 2 glyphs
+; side-by-side. When rendering into 5x6 cells, the bottom line and
+; the left column are set to all 0, so the glyphs can take up the
+; entire 4x5 space.
+; Only character codes 32 through 127 are supported; this is 96
+; characters. At 2 glyphs per 5 bytes, that's 96/2*5=240 bytes,
+; which means the whole font fits into one page and can be
+; accessed with X or Y indexed mode rather than (indirect),Y.
+
+font_data:
+ include font4x5.inc
+
+; ----------------------------------------------------------------------------
+; Mask tables, used by setup_mask. Indexed by (COLCRS % 8), since they
+; would repeat every 8 bytes anyway.
+
+mask_lo_tab:
+ byte $07, $F8, $C1, $FE, $F0, $83, $FC, $E0
+
+; In mask_hi_tab, $00 is never a valid mask, while $FF means "don't touch any
+; bits in 2nd byte". As a minor optimization, $00 appears in the table in
+; place of $FF. This allows us to just test the Z flag after loading the mask
+; hi byte, instead of needing to compare against $FF.
+
+mask_hi_tab:
+ byte $00, $3F, $00, $0F, $7F, $00, $1F, $00
+
+; ----------------------------------------------------------------------------
+; Indexed by COLCRS%8, how many bits to shift the font data right
+; The mask_*_tab stuff above could be calculated at runtime from this,
+; the tables are only there for speed.
+shift_amount_tab:
+ byte $00, $05, $02, $07, $04, $01, $06, $03
+
+; ----------------------------------------------------------------------------
+; Line address tables, used by setup_screen_ptr.
+
+line_addr_tab_hi:
+ byte $00, $00, $01, $02, $03, $04, $05, $06
+ byte $07, $08, $09, $0a, $0b, $0c, $0d, $0e
+ byte $0f, $0f, $10, $11, $12, $13, $14, $15
+ byte $16, $17, $18, $19, $1a, $1b, $1c, $1d
+
+line_addr_tab_lo:
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+ byte $00, $f0, $e0, $d0, $c0, $b0, $a0, $90
+ byte $80, $70, $60, $50, $40, $30, $20, $10
+
+; ----------------------------------------------------------------------------
+; Byte offset within scanline, indexed by COLCRS value
+; Used by setup_screen_ptr
+
+column_byte_tab:
+ byte $00, $00, $01, $01, $02, $03, $03, $04
+ byte $05, $05, $06, $06, $07, $08, $08, $09
+ byte $0A, $0A, $0B, $0B, $0C, $0D, $0D, $0E
+ byte $0F, $0F, $10, $10, $11, $12, $12, $13
+ byte $14, $14, $15, $15, $16, $17, $17, $18
+ byte $19, $19, $1A, $1A, $1B, $1C, $1C, $1D
+ byte $1E, $1E, $1F, $1F, $20, $21, $21, $22
+ byte $23, $23, $24, $24, $25, $26, $26, $27
+
+; ----------------------------------------------------------------------------
+; Handler table (HATABS will point to this).
+; See the HATABS and EDITRV entries in Mapping the Atari for details.
+
+col64_vector_tab:
+ word col64_open-1 ; OPEN vector
+ word col64_close-1 ; CLOSE vector
+ word col64_getbyte-1 ; GET BYTE vector
+ word col64_putbyte-1 ; PUT BYTE vector
+ word col64_close-1 ; GET STATUS vector
+ word col64_close-1 ; SPECIAL vector
+ jmp col64_init ; Jump to initialization code (JMP LSB/MSB)
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08 ; graphics mode 8
+ sta ICAX2Z
+ lda #$0C ; R/W access
+ sta ICAX1Z
+ jsr open_s_dev
+
+ ; Set default colors
+ lda #DEFAULT_BG_COLOR
+ sta COLOR2
+ sta COLOR4
+ lda #DEFAULT_TEXT_COLOR
+ sta COLOR1
+
+ ; Protect ourselves from the OS
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ rts
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi
+ pha
+ lda s_dev_open_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL64 maintains a line buffer. Each time col64_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is exactly how the OS E: device works.
+
+col64_getbyte:
+ lda BUFCNT
+ beq get_line
+
+get_next_byte:
+ ldx line_buffer_index
+ lda line_buffer,x
+ dec BUFCNT
+ inc line_buffer_index
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Get a line of input from the user, terminated by the Return key.
+
+get_line:
+ lda #$00
+ sta BUFCNT
+ sta line_buffer_index
+
+show_cursor:
+ lda #$00
+ sta TMPCHR
+ lda #INVERTED_MASK
+ sta inverse_mask
+ jsr render_glyph
+ jsr get_keystroke
+ cpy #$01
+ beq keystroke_ok
+ dey ; yes, we really care about 1-byte optimizations
+ sty line_buffer_index
+ sty BUFCNT
+
+keystroke_ok:
+ cmp #$20
+ bcc show_cursor ; ignore low ASCII
+ cmp #EOL
+ bne check_backs_key
+ jmp return_key_hit
+
+check_backs_key:
+ cmp #$7E
+ bne check_clear_key
+ jmp backs_key_hit
+
+check_clear_key:
+ cmp #$7D
+ bne normal_key_hit
+ jmp clear_key_hit
+
+normal_key_hit:
+ ldx BUFCNT
+ bpl buffer_character
+; jmp beep ; if we implemented it...
+ jmp show_cursor
+
+buffer_character:
+ sta line_buffer,x
+ jsr col64_putbyte
+ inc BUFCNT
+ jmp show_cursor
+
+return_key_hit:
+ jsr print_space
+ lda #EOL
+ ldx BUFCNT
+ sta line_buffer,x
+ inc BUFCNT
+ jsr col64_putbyte
+ jmp get_next_byte
+
+clear_key_hit:
+; jsr clear_screen ; if we implemented it...
+ lda #$00
+ sta line_buffer_index
+ sta BUFCNT
+ jmp get_line
+
+backs_key_hit:
+ jsr print_space
+ lda BUFCNT
+ beq backs_key_done
+ dec COLCRS
+ lda COLCRS
+ clc
+ adc #$01
+ cmp LMARGN
+ bne backs_same_line
+ lda RMARGN
+ sta COLCRS
+ dec ROWCRS
+
+backs_same_line:
+ dec BUFCNT
+
+backs_key_done:
+ jmp show_cursor
+
+; ----------------------------------------------------------------------------
+; Print a space character at the current cursor position. Does not
+; update the cursor position.
+print_space:
+ lda #$00
+ sta inverse_mask
+
+ sta TMPCHR
+ jsr render_glyph
+ rts
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+
+get_keystroke:
+ lda k_dev_get_hi
+ pha
+ lda k_dev_get_lo
+ pha
+ rts
+
+
+; ----------------------------------------------------------------------------
+; Unimplemented CIO callbacks here. Also various other routines jump here
+; to return success to the caller.
+
+col64_close:
+return_success:
+ ldy #$01
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO OPEN command callback
+
+col64_open:
+ jsr init_graphics_8
+ lda #$00
+ sta ROWCRS
+ sta COLCRS
+ sta BUFCNT
+ sta LMARGN
+ lda #DEFAULT_RMARGN
+ sta RMARGN
+ rts
+
+; ----------------------------------------------------------------------------
+; CIO PUT BYTE command callback
+; The byte to put is passed to us in the accumulator.
+
+col64_putbyte:
+ ; EOL (decimal 155)?
+ cmp #EOL
+;;; bne check_clear
+ bne regular_char
+ lda RMARGN
+ sta COLCRS
+ jmp skip_write
+
+;;;check_clear:
+;;; ; save memory by not including clear_screen
+;;; ; (also, this lets us print the } character)
+;;; ; Clear (decimal 125)?
+;;; cmp #$7D
+;;; bne regular_char
+;;; jmp clear_screen
+;;; .endif
+;;;
+
+; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax
+ bpl not_inverse
+ lda #INVERTED_MASK
+ sta inverse_mask
+ bne skip_ninv
+
+not_inverse:
+ lda #$00
+ sta inverse_mask
+
+skip_ninv:
+ txa
+ and #$7F
+ sec
+ sbc #$20
+ bcs not_low_ascii
+ jmp return_success
+
+not_low_ascii:
+ sta TMPCHR
+
+ lda DINDEX ; OS stores current graphics mode here
+ cmp #$08
+ beq graphics_ok
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col64_open
+
+graphics_ok:
+ jsr render_glyph
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor
+
+; Could implement SSFLAG logic here
+;check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ ;lda SSFLAG
+ ;bne check_ssflag
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Call the routines that actually print the character.
+; render_glyph prints the character in TMPCHR at the current
+; COLCRS and ROWCRS, and does NOT advance the cursor.
+; TMPCHR should already have bit 7 stripped; render_glyph will
+; use inverse_mask, so the caller should have set that up as well.
+render_glyph:
+ jsr setup_mask
+ jsr setup_screen_ptr
+ jsr setup_font_index
+ jmp write_font_data
+
+; ----------------------------------------------------------------------------
+; mask is used to avoid overwriting pixels outside the character cell
+; we're currently writing. Since 5 pixel wide cells don't align on byte
+; boundaries in screen RAM, we have to read/modify/write 2 bytes, and
+; the mask also has to be 2 bytes wide.
+; Also we set up shift_amount here.
+
+setup_mask:
+ lda COLCRS
+ and #$07
+ tax
+ lda mask_lo_tab,x
+ sta mask_lo
+ lda mask_hi_tab,x
+ sta mask_hi
+ lda shift_amount_tab,x
+ sta shift_amount
+ rts
+
+
+; ----------------------------------------------------------------------------
+; Make (screen_ptr_lo) point to the first byte of screen RAM on the top scanline
+; of the current char cell. Assumes COLCRS/ROWCRS are never out of range!
+setup_screen_ptr:
+ ; first the row... table lookup quicker than mult by 240
+ ldx ROWCRS
+ clc
+ lda SAVMSC
+ adc line_addr_tab_lo,x
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ adc line_addr_tab_hi,x
+ sta screen_ptr_hi
+
+ ; now do the column
+ ldx COLCRS
+ lda screen_ptr_lo
+ clc
+ adc column_byte_tab,x
+ sta screen_ptr_lo
+ lda #0
+ adc screen_ptr_hi
+ sta screen_ptr_hi
+
+ rts
+
+; ----------------------------------------------------------------------------
+; Set up font_index to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+; Calculation is:
+; lo_nybble_flag = (TMPCHR & 1) ? $FF : $00;
+; font_index = (TMPCHR >> 1) * 5;
+
+setup_font_index:
+ lda #$00
+ sta lo_nybble_flag
+ lda TMPCHR
+ lsr ; a = (TMPCHR >> 1)
+ tay ; y = a
+ bcc font_hi_nybble
+ dec lo_nybble_flag ; = $FF
+
+font_hi_nybble:
+ clc
+ asl ; a *= 2
+ asl ; a *= 2
+ sta font_index
+ tya
+ adc font_index
+ sta font_index
+
+ rts
+
+
+; ----------------------------------------------------------------------------
+; When write_font_data is called:
+; - font_index is the 1-byte index into font_data where the current glyph is
+; - lo_nybble_flag is 0 for high nybble of glyph data, $FF for low
+; - mask_lo/hi is our 16-bit pixel mask (1's are "leave original data")
+; - shift_amount is # of times to shift glyph data right
+; - screen_ptr_lo/hi points to the 1st byte on the top line
+
+; Loop 5 times, each time thru the loop:
+; - extract 4-bit glyph data, store in glyph_data_lo
+; - shift right shift_amount times
+; ...write data...
+; - add 40 to 16-bit screen_ptr_lo/hi (to get to next line)
+
+write_font_data:
+ lda #$05
+ sta line_count
+
+wfont_line_loop:
+ lda #$00
+ tay
+ sta glyph_data_hi
+
+ ldx font_index
+ lda font_data,x
+
+ bit lo_nybble_flag
+ beq use_hi_nybble
+
+ asl
+ asl
+ asl
+ asl
+
+use_hi_nybble: ; 4-bit glyph data now in hi nybble
+ and #$F0
+ eor inverse_mask
+ sta glyph_data_lo
+
+ ldx shift_amount
+ beq wfont_no_shift
+
+wfont_shift_loop:
+ lsr glyph_data_lo
+ ror glyph_data_hi
+ dex
+ bne wfont_shift_loop
+
+wfont_no_shift:
+ lda mask_lo
+ and (screen_ptr_lo),y
+ ora glyph_data_lo
+ sta (screen_ptr_lo),y
+
+ lda mask_hi
+ beq wfont_skip_hi
+ iny
+ and (screen_ptr_lo),y
+ ora glyph_data_hi
+ sta (screen_ptr_lo),y
+
+wfont_skip_hi:
+ dec line_count
+ bmi wfont_done
+ bne wfont_not_bottom
+
+ stx font_index ; X always 0: for last line, cheat and use the space glyph
+ stx lo_nybble_flag
+
+wfont_not_bottom:
+ lda #$28 ; 40 bytes to next line
+ clc
+ adc screen_ptr_lo
+ sta screen_ptr_lo
+ bcc wfont_noinc
+ inc screen_ptr_hi
+
+wfont_noinc:
+ inc font_index
+ bne wfont_line_loop ; branch always
+
+wfont_done:
+ rts
+
+; ----------------------------------------------------------------------------
+; Not the fastest scroller in the west... TODO: make faster :)
+
+; glyph_data_lo points to line N
+; screen_ptr_lo points to line N+1
+scroll_screen:
+ lda #0
+ sta COLCRS
+ sta ROWCRS
+ jsr setup_screen_ptr
+
+scroll_line_loop:
+ lda screen_ptr_lo
+ sta glyph_data_lo
+ lda screen_ptr_hi
+ sta glyph_data_hi
+ ldx ROWCRS
+ cpx #LAST_ROW
+ beq scroll_blank
+ inx
+ stx ROWCRS
+ jsr setup_screen_ptr
+ ldy #0
+
+scroll_byte_loop:
+ lda (screen_ptr_lo),y
+ sta (glyph_data_lo),y
+ iny
+ cpy #$F0
+ bne scroll_byte_loop
+ beq scroll_line_loop
+
+scroll_blank:
+ jsr setup_screen_ptr
+ ldy #0
+ tya
+sblank_loop:
+ sta (screen_ptr_lo),y
+ iny
+ cpy #$F0
+ bne sblank_loop
+
+ rts
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS
+ lda RMARGN
+ cmp COLCRS
+ bcs same_line
+ lda LMARGN
+ sta COLCRS
+ lda ROWCRS
+ cmp #LAST_ROW
+ bcc no_scroll
+ jsr scroll_screen
+ ; Move to last row after scrolling
+ lda #LAST_ROW-1
+ sta ROWCRS
+
+no_scroll:
+ inc ROWCRS
+
+same_line:
+ rts
+
+; ----------------------------------------------------------------------------
+; Initialization. If we don't want the handler to survive a warmstart, we
+; can load this bit into e.g. the cassette buffer (throw away after running)
+
+col64_init:
+ ldy #$00
+
+next_hatab_slot:
+ lda HATABS,y
+ beq register_x_handler
+ iny
+ iny
+ iny
+ cpy #$20
+ bcc next_hatab_slot
+ jmp return_success
+
+register_x_handler:
+ lda #$58
+ sta HATABS,y
+ lda #<col64_vector_tab
+ iny
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+ jmp return_success
+
+main_entry_point:
+ jsr col64_init
+ lda #$0C
+ sta ICCOM
+ ldx #$00
+ jsr CIOV
+ lda #$58
+ sta font_index
+ lda #$03
+ sta ICCOM
+ lda #font_index
+ sta ICBAL
+ lda #$00
+ sta ICBAH
+ ldx #$00
+ jsr CIOV
+ ldy #$07
+ lda #<col64_vector_tab
+ sta HATABS,y
+ lda #>col64_vector_tab
+ iny
+ sta HATABS,y
+no_e_handler:
+ lda #<START_ADDRESS_1
+ sta MEMTOP
+ lda #>START_ADDRESS_1
+ sta MEMTOP+1
+ jmp return_success
+
+END_ADDR_1 = *-1
+
+; XEX segment (run address)
+ word INITAD
+ word INITAD+1
+ word main_entry_point
diff --git a/src/col64/cruft/col64.sh b/src/col64/cruft/col64.sh
new file mode 100644
index 0000000..cc49b07
--- /dev/null
+++ b/src/col64/cruft/col64.sh
@@ -0,0 +1,6 @@
+dasm col64.dasm -f3 -otest -llist
+cp test col64.xex
+axe -w test test.atr
+cat test hello.xex > test2
+axe -w test2 test.atr
+atari800 -atari test.atr
diff --git a/src/col64/cruft/col64_ext.inc b/src/col64/cruft/col64_ext.inc
new file mode 100644
index 0000000..81e7660
--- /dev/null
+++ b/src/col64/cruft/col64_ext.inc
@@ -0,0 +1,48 @@
+ byte $04, $04, $04, $00, $04 ; [0] 32,33 ,!
+ byte $AA, $AF, $0A, $0F, $0A ; [5] 34,35 ",#
+ byte $70, $A9, $62, $54, $E9 ; [10] 36,37 $,%
+ byte $42, $A2, $44, $A0, $D0 ; [15] 38,39 &,'
+ byte $24, $42, $42, $42, $24 ; [20] 40,41 (,)
+ byte $A4, $44, $EE, $44, $A4 ; [25] 42,43 *,+
+ byte $00, $00, $0F, $20, $40 ; [30] 44,45 ,,-
+ byte $02, $02, $04, $08, $48 ; [35] 46,47 .,/
+ byte $64, $9C, $B4, $D4, $6E ; [40] 48,49 0,1
+ byte $6E, $91, $26, $41, $FE ; [45] 50,51 2,3
+ byte $2F, $68, $AE, $F1, $2E ; [50] 52,53 4,5
+ byte $7F, $81, $E2, $94, $64 ; [55] 54,55 6,7
+ byte $66, $99, $67, $91, $6E ; [60] 56,57 8,9
+ byte $00, $42, $00, $02, $44 ; [65] 58,59 :,;
+ byte $20, $4F, $80, $4F, $20 ; [70] 60,61 <,=
+ byte $87, $49, $22, $40, $82 ; [75] 62,63 >,?
+ byte $66, $B9, $BF, $89, $69 ; [80] 64,65 @,A
+ byte $E6, $99, $E8, $99, $E6 ; [85] 66,67 B,C
+ byte $EF, $98, $9E, $98, $EF ; [90] 68,69 D,E
+ byte $F7, $88, $EB, $89, $86 ; [95] 70,71 F,G
+ byte $9E, $94, $F4, $94, $9E ; [100] 72,73 H,I
+ byte $39, $1A, $1C, $9A, $69 ; [105] 74,75 J,K
+ byte $8A, $8F, $8D, $89, $F9 ; [110] 76,77 L,M
+ byte $96, $D9, $B9, $99, $96 ; [115] 78,79 N,O
+ byte $E6, $99, $E9, $8A, $85 ; [120] 80,81 P,Q
+ byte $E7, $98, $E6, $A1, $9E ; [125] 82,83 R,S
+ byte $F9, $49, $49, $49, $46 ; [130] 84,85 T,U
+ byte $99, $99, $9D, $AF, $4A ; [135] 86,87 V,W
+ byte $99, $99, $66, $92, $94 ; [140] 88,89 X,Y
+ byte $F6, $24, $44, $84, $F6 ; [145] 90,91 Z,[
+ byte $86, $82, $42, $22, $26 ; [150] 92,93 \,]
+ byte $40, $A0, $00, $00, $0F ; [155] 94,95 ^,_
+ byte $40, $47, $29, $0B, $05 ; [160] 96,97 `,a
+ byte $80, $87, $E8, $98, $E7 ; [165] 98,99 b,c
+ byte $10, $16, $79, $9E, $77 ; [170] 100,101 d,e
+ byte $60, $47, $E9, $47, $41 ; [175] 102,103 f,g
+ byte $84, $80, $EC, $94, $9E ; [180] 104,105 h,i
+ byte $28, $0A, $6C, $2A, $29 ; [185] 106,107 j,k
+ byte $C0, $4A, $4F, $4D, $E9 ; [190] 108,109 l,m
+ byte $00, $E6, $99, $99, $96 ; [195] 110,111 n,o
+ byte $00, $E7, $99, $E7, $81 ; [200] 112,113 p,q
+ byte $00, $A7, $DC, $83, $8E ; [205] 114,115 r,s
+ byte $40, $E9, $49, $49, $26 ; [210] 116,117 t,u
+ byte $00, $99, $9D, $AF, $4A ; [215] 118,119 v,w
+ byte $00, $99, $69, $66, $92 ; [220] 120,121 x,y
+ byte $06, $F4, $28, $44, $F6 ; [225] 122,123 z,{
+ byte $4C, $44, $42, $44, $4C ; [230] 124,125 |,}
+ byte $06, $5C, $A8, $01, $0C ; [235] 126,127 ~,
diff --git a/src/col64/cruft/col64font.bdf b/src/col64/cruft/col64font.bdf
new file mode 100644
index 0000000..b15f724
--- /dev/null
+++ b/src/col64/cruft/col64font.bdf
@@ -0,0 +1,11993 @@
+STARTFONT 2.1
+COMMENT Contributed by Janne V. Kujala <jvk@iki.fi>
+COMMENT $Id: 4x6.bdf,v 1.5 2002-08-26 18:05:49+01 mgk25 Rel $
+COMMENT Send bug reports to Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+FONT -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1
+SIZE 6 75 75
+FONTBOUNDINGBOX 4 6 0 -1
+STARTPROPERTIES 23
+FONTNAME_REGISTRY ""
+FOUNDRY "Misc"
+FAMILY_NAME "Fixed"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 6
+POINT_SIZE 60
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 40
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 5
+FONT_DESCENT 1
+DESTINATION 1
+COPYRIGHT "Public domain font. Share and enjoy."
+CAP_HEIGHT 5
+X_HEIGHT 4
+DEFAULT_CHAR 0
+_GBDFED_INFO "Edited with gbdfed 1.4."
+ENDPROPERTIES
+CHARS 920
+STARTCHAR char0
+ENCODING 0
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+A0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+60
+50
+E0
+00
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+20
+40
+90
+00
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+A0
+D0
+00
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+A0
+00
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+B0
+D0
+60
+00
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+10
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+F0
+20
+00
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+10
+E0
+00
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+E0
+90
+60
+00
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+10
+20
+40
+40
+00
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+60
+90
+60
+00
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+70
+10
+E0
+00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+80
+40
+20
+00
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+20
+40
+80
+00
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+20
+00
+20
+00
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+B0
+B0
+80
+60
+00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+80
+90
+60
+00
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+90
+90
+E0
+00
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+F0
+00
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+B0
+90
+60
+00
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+10
+10
+90
+60
+00
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+F0
+00
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+D0
+90
+90
+00
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+D0
+B0
+90
+90
+00
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+A0
+50
+00
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+A0
+90
+00
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+90
+90
+00
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+20
+40
+00
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+40
+80
+F0
+00
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+40
+40
+60
+00
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F0
+00
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+30
+50
+90
+70
+00
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+80
+80
+70
+00
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+70
+90
+70
+00
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+A0
+70
+00
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+70
+10
+60
+00
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+90
+00
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+F0
+D0
+90
+00
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+90
+90
+00
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+E0
+80
+00
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+70
+10
+00
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+80
+80
+00
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+C0
+30
+E0
+00
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+80
+40
+60
+00
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+20
+40
+C0
+00
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+90
+00
+90
+D0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+E0
+40
+00
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+40
+A0
+00
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+00
+40
+40
+00
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+D0
+D0
+90
+60
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+00
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+D0
+60
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+C0
+00
+00
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+40
+80
+00
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+D0
+D0
+50
+50
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+50
+70
+10
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+10
+20
+30
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+50
+B0
+10
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+F0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+80
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+50
+D0
+50
+E0
+00
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+E0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+A0
+00
+00
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+E0
+80
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+80
+60
+40
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+40
+00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+A0
+60
+20
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+20
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+40
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+20
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+A0
+A0
+20
+60
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+20
+20
+C0
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+E0
+20
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+C0
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+A0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+50
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+20
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+40
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+00
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+A0
+20
+40
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+00
+40
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+C0
+80
+80
+20
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+E0
+00
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+20
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+60
+40
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+40
+80
+00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR longs
+ENCODING 383
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni018F
+ENCODING 399
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+40
+80
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+00
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+80
+C0
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0374
+ENCODING 884
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0375
+ENCODING 885
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR uni037A
+ENCODING 890
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+60
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR Alphatonos
+ENCODING 902
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR Epsilontonos
+ENCODING 904
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+60
+40
+60
+00
+ENDCHAR
+STARTCHAR Etatonos
+ENCODING 905
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Iotatonos
+ENCODING 906
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Omicrontonos
+ENCODING 908
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Upsilontonos
+ENCODING 910
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omegatonos
+ENCODING 911
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR iotadieresistonos
+ENCODING 912
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+40
+20
+00
+ENDCHAR
+STARTCHAR Alpha
+ENCODING 913
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Beta
+ENCODING 914
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Gamma
+ENCODING 915
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR Delta
+ENCODING 916
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Epsilon
+ENCODING 917
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zeta
+ENCODING 918
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eta
+ENCODING 919
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Theta
+ENCODING 920
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Iota
+ENCODING 921
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Kappa
+ENCODING 922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Lambda
+ENCODING 923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Mu
+ENCODING 924
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Nu
+ENCODING 925
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR Xi
+ENCODING 926
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR Omicron
+ENCODING 927
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Pi
+ENCODING 928
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Rho
+ENCODING 929
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR Sigma
+ENCODING 931
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Tau
+ENCODING 932
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Upsilon
+ENCODING 933
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Phi
+ENCODING 934
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR Chi
+ENCODING 935
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Psi
+ENCODING 936
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 937
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR Iotadieresis
+ENCODING 938
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Upsilondieresis
+ENCODING 939
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR alphatonos
+ENCODING 940
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR epsilontonos
+ENCODING 941
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR etatonos
+ENCODING 942
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR iotatonos
+ENCODING 943
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresistonos
+ENCODING 944
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR alpha
+ENCODING 945
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+A0
+50
+00
+ENDCHAR
+STARTCHAR beta
+ENCODING 946
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR gamma
+ENCODING 947
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR delta
+ENCODING 948
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR epsilon
+ENCODING 949
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR zeta
+ENCODING 950
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+80
+E0
+20
+40
+ENDCHAR
+STARTCHAR eta
+ENCODING 951
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR theta
+ENCODING 952
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR iota
+ENCODING 953
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR kappa
+ENCODING 954
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR lambda
+ENCODING 955
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR nu
+ENCODING 957
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+40
+00
+ENDCHAR
+STARTCHAR xi
+ENCODING 958
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR omicron
+ENCODING 959
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR pi
+ENCODING 960
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR rho
+ENCODING 961
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR sigma1
+ENCODING 962
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+40
+C0
+00
+ENDCHAR
+STARTCHAR sigma
+ENCODING 963
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+A0
+40
+00
+ENDCHAR
+STARTCHAR tau
+ENCODING 964
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilon
+ENCODING 965
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR phi
+ENCODING 966
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+A0
+40
+40
+ENDCHAR
+STARTCHAR chi
+ENCODING 967
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+60
+A0
+00
+ENDCHAR
+STARTCHAR psi
+ENCODING 968
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR omega
+ENCODING 969
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR iotadieresis
+ENCODING 970
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresis
+ENCODING 971
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omicrontonos
+ENCODING 972
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR upsilontonos
+ENCODING 973
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omegatonos
+ENCODING 974
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10023
+ENCODING 1025
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10051
+ENCODING 1026
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10052
+ENCODING 1027
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10053
+ENCODING 1028
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10054
+ENCODING 1029
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10055
+ENCODING 1030
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10056
+ENCODING 1031
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10057
+ENCODING 1032
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10058
+ENCODING 1033
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10059
+ENCODING 1034
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10060
+ENCODING 1035
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10061
+ENCODING 1036
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10062
+ENCODING 1038
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10145
+ENCODING 1039
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10017
+ENCODING 1040
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10018
+ENCODING 1041
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10019
+ENCODING 1042
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10020
+ENCODING 1043
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10021
+ENCODING 1044
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10022
+ENCODING 1045
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10024
+ENCODING 1046
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10025
+ENCODING 1047
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10026
+ENCODING 1048
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+E0
+A0
+20
+00
+ENDCHAR
+STARTCHAR afii10027
+ENCODING 1049
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR afii10028
+ENCODING 1050
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10029
+ENCODING 1051
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10030
+ENCODING 1052
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10031
+ENCODING 1053
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10032
+ENCODING 1054
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10033
+ENCODING 1055
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10034
+ENCODING 1056
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10035
+ENCODING 1057
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10036
+ENCODING 1058
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10037
+ENCODING 1059
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+40
+40
+80
+ENDCHAR
+STARTCHAR afii10038
+ENCODING 1060
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii10039
+ENCODING 1061
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10040
+ENCODING 1062
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii10041
+ENCODING 1063
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+60
+20
+20
+00
+ENDCHAR
+STARTCHAR afii10042
+ENCODING 1064
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10043
+ENCODING 1065
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10044
+ENCODING 1066
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10045
+ENCODING 1067
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10046
+ENCODING 1068
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10047
+ENCODING 1069
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10048
+ENCODING 1070
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+D0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10049
+ENCODING 1071
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10065
+ENCODING 1072
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR afii10066
+ENCODING 1073
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10067
+ENCODING 1074
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10068
+ENCODING 1075
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10069
+ENCODING 1076
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10070
+ENCODING 1077
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10072
+ENCODING 1078
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+60
+60
+B0
+00
+ENDCHAR
+STARTCHAR afii10073
+ENCODING 1079
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10074
+ENCODING 1080
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10075
+ENCODING 1081
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10076
+ENCODING 1082
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10077
+ENCODING 1083
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10078
+ENCODING 1084
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10079
+ENCODING 1085
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10080
+ENCODING 1086
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10081
+ENCODING 1087
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10082
+ENCODING 1088
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii10083
+ENCODING 1089
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10084
+ENCODING 1090
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10085
+ENCODING 1091
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR afii10086
+ENCODING 1092
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR afii10087
+ENCODING 1093
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii10088
+ENCODING 1094
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+20
+ENDCHAR
+STARTCHAR afii10089
+ENCODING 1095
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+00
+ENDCHAR
+STARTCHAR afii10090
+ENCODING 1096
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10091
+ENCODING 1097
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10092
+ENCODING 1098
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10093
+ENCODING 1099
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10094
+ENCODING 1100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10095
+ENCODING 1101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10096
+ENCODING 1102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10097
+ENCODING 1103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+60
+A0
+00
+ENDCHAR
+STARTCHAR afii10071
+ENCODING 1105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10099
+ENCODING 1106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+20
+ENDCHAR
+STARTCHAR afii10100
+ENCODING 1107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10101
+ENCODING 1108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10102
+ENCODING 1109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10103
+ENCODING 1110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10104
+ENCODING 1111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10105
+ENCODING 1112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR afii10106
+ENCODING 1113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10107
+ENCODING 1114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10108
+ENCODING 1115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10109
+ENCODING 1116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10110
+ENCODING 1118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10193
+ENCODING 1119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10050
+ENCODING 1168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10098
+ENCODING 1169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR uni0492
+ENCODING 1170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni0493
+ENCODING 1171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii57664
+ENCODING 1488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii57665
+ENCODING 1489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+F0
+00
+ENDCHAR
+STARTCHAR afii57666
+ENCODING 1490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii57667
+ENCODING 1491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57668
+ENCODING 1492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57669
+ENCODING 1493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57670
+ENCODING 1494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii57671
+ENCODING 1495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57672
+ENCODING 1496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii57673
+ENCODING 1497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR afii57674
+ENCODING 1498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57675
+ENCODING 1499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii57676
+ENCODING 1500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR afii57677
+ENCODING 1501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57678
+ENCODING 1502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57679
+ENCODING 1503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57680
+ENCODING 1504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR afii57681
+ENCODING 1505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii57682
+ENCODING 1506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+60
+C0
+00
+ENDCHAR
+STARTCHAR afii57683
+ENCODING 1507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57684
+ENCODING 1508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57685
+ENCODING 1509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57686
+ENCODING 1510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57687
+ENCODING 1511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57688
+ENCODING 1512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57689
+ENCODING 1513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+D0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57690
+ENCODING 1514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+20
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+60
+20
+40
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2016
+ENCODING 8214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR underscoredbl
+ENCODING 8215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 'UÂ?-1
+BITMAP
+00
+00
+00
+F0
+00
+F0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 640 01¥VDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+20
+40
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING1MÀ-2
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+50
+50
+A0
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+50
+00
+00
+00
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2023
+ENCODING 8227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+E0
+C0
+00
+00
+ENDCHAR
+STARTCHAR onedotenleader
+ENCODING 8228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR twodotenleader
+ENCODING 8229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+A0
+00
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+B0
+00
+ENDCHAR
+STARTCHAR uni2027
+ENCODING 8231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR perthousand
+ENCODX;µ?8240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+80
+30
+00
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+80
+40
+00
+00
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+20
+40
+00
+00
+ENDCHAR
+STARTCHAR uni203E
+ENCODING 8254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR nsuperior
+ENCODING 8319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR peseta
+ENCODING 8359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+60
+40
+40
+00
+ENDCHAR
+SE4 KCHAR Euro
+ENCODING 8364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR afii61352
+ENCODING 8470
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+B0
+B0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+00
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 8486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni2127
+ENCODING 8487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR oneeighth
+ENCODING 8539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 'UÂ?-1
+BITMAP
+80
+80
+B0
+20
+50
+20
+ENDCHAR
+STARTCHAR threeeighths
+ENCODING 8540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+60
+D0
+20
+ENDCHAR
+STARTCHAR fiveeighths
+ENCODING 8541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+70
+A0
+50
+20
+ENDCHAR
+STARTCHAR seveneighths
+ENCODING 8542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+A0
+50
+20
+ENDCHAR
+STARTCHAR arrowleft
+ENCODING 8592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+F0
+40
+00
+00
+ENDCHAR
+STARTCHAR arrowup
+ENCODING 8593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR arrowright
+ENCODING 8594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+F0
+20
+00
+00
+ENDCHAR
+STARTCHAR arrowdown
+ENCODING 8595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR arrowboth
+ENCODING 8596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+F0
+50
+00
+00
+ENDCHAR
+STARTCHAR arrowupdn
+ENCODING 8597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni2201
+ENCODING 8705
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR partialdiff
+ENCODING 8706
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+E0
+60
+E0
+80
+ENDCHAR
+STARTCHAR emptyset
+ENCODING 8709
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR Delta
+ENCODING 8710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR gradient
+ENCODING 8711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR element
+ENCODING 8712
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+80
+60
+00
+ENDCHAR
+STARTCHAR notelement
+ENCODING 8713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+E0
+A0
+60
+40
+ENDCHAR
+STARTCHAR uni220A
+ENCODING 8714
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+C0
+80
+40
+00
+ENDCHAR
+STARTCHAR suchthat
+ENCODING 8715
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+E0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni220C
+ENCODING 8716
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR uni220D
+ENCODING 8717
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+C0
+40
+80
+00
+ENDCHAR
+STARTCHAR uni220E
+ENCODING 8718
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+00
+ENDCHAR
+STARTCHAR product
+ENCODING 8719
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2210
+ENCODING 8720
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR summation
+ENCODING 8721
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2213
+ENCODING 8723
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni2214
+ENCODING 8724
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR uni2216
+ENCODING 8726
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR asteriskmath
+ENCODING 8727
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+70
+E0
+50
+40
+ENDCHAR
+STARTCHAR uni2218
+ENCODING 8728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+00
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR radical
+ENCODING 8730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+20
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni221B
+ENCODING 8731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+50
+D0
+10
+50
+30
+ENDCHAR
+STARTCHAR uni221C
+ENCODING 8732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+D0
+50
+10
+50
+30
+ENDCHAR
+STARTCHAR proportional
+ENCODING 8733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+E0
+50
+00
+ENDCHAR
+STARTCHAR infinity
+ENCODING 8734
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+D0
+B0
+40
+00
+ENDCHAR
+STARTCHAR orthogonal
+ENCODING 8735
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR angle
+ENCODING 8736
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR uni2221
+ENCODING 8737
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+A0
+40
+A0
+F0
+20
+ENDCHAR
+STARTCHAR uni2222
+ENCODING 8738
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+A0
+A0
+60
+90
+ENDCHAR
+STARTCHAR uni2223
+ENCODING 8739
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni2224
+ENCODING 8740
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+40
+00
+ENDCHAR
+STARTCHAR uni2225
+ENCODING 8741
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2226
+ENCODING 8742
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+B0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicaland
+ENCODING 8743
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicalor
+ENCODING 8744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR intersection
+ENCODING 8745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR union
+ENCODING 8746
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR integral
+ENCODING 8747
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR uni222C
+ENCODING 8748
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+A0
+A0
+80
+ENDCHAR
+STARTCHAR uni222D
+ENCODING 8749
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+D0
+D0
+D0
+A0
+ENDCHAR
+STARTCHAR uni222E
+ENCODING 8750
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+E0
+40
+80
+ENDCHAR
+STARTCHAR uni222F
+ENCODING 8751
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+80
+ENDCHAR
+STARTCHAR uni2230
+ENCODING 8752
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+F0
+F0
+D0
+A0
+ENDCHAR
+STARTCHAR uni2231
+ENCODING 8753
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+50
+40
+80
+ENDCHAR
+STARTCHAR uni2232
+ENCODING 8754
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+C0
+40
+80
+ENDCHAR
+STARTCHAR uni2233
+ENCODING 8755
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+E0
+40
+80
+ENDCHAR
+STARTCHAR therefore
+ENCODING 8756
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2235
+ENCODING 8757
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2237
+ENCODING 8759
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2238
+ENCODING 8760
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2239
+ENCODING 8761
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+20
+C0
+20
+00
+ENDCHAR
+STARTCHAR uni223A
+ENCODING 8762
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni223B
+ENCODING 8763
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+50
+A0
+00
+40
+ENDCHAR
+STARTCHAR similar
+ENCODING 8764
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni223D
+ENCODING 8765
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni223E
+ENCODING 8766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+D0
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni223F
+ENCODING 8767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+50
+A0
+20
+00
+ENDCHAR
+STARTCHAR uni2240
+ENCODING 8768
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR uni2241
+ENCODING 8769
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+B0
+D0
+40
+80
+ENDCHAR
+STARTCHAR uni2242
+ENCODING 8770
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+00
+A0
+50
+00
+ENDCHAR
+STARTCHAR uni2243
+ENCODING 8771
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2244
+ENCODING 8772
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+D0
+B0
+40
+F0
+40
+ENDCHAR
+STARTCHAR congruent
+ENCODING 8773
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni2246
+ENCODING 8774
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR uni2247
+ENCODING 8775
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR approxequal
+ENCODING 8776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni2249
+ENCODING 8777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+40
+50
+E0
+80
+ENDCHAR
+STARTCHAR uni224A
+ENCODING 8778
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+00
+F0
+ENDCHAR
+STARTCHAR uni224B
+ENCODING 8779
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+40
+B0
+ENDCHAR
+STARTCHAR uni224C
+ENCODING 8780
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+50
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni224D
+ENCODING 8781
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni224E
+ENCODING 8782
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni224F
+ENCODING 8783
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2250
+ENCODING 8784
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2251
+ENCODING 8785
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+40
+ENDCHAR
+STARTCHAR uni2252
+ENCODING 8786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+00
+E0
+00
+20
+ENDCHAR
+STARTCHAR uni2253
+ENCODING 8787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+00
+E0
+00
+80
+ENDCHAR
+STARTCHAR uni2254
+ENCODING 8788
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+00
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni2255
+ENCODING 8789
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+D0
+00
+D0
+00
+00
+ENDCHAR
+STARTCHAR uni2256
+ENCODING 8790
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2257
+ENCODING 8791
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2258
+ENCODING 8792
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225B
+ENCODING 8795
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225C
+ENCODING 8796
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225D
+ENCODING 8797
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225E
+ENCODING 8798
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225F
+ENCODING 8799
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2263
+ENCODING 8803
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2266
+ENCODING 8806
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2267
+ENCODING 8807
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2268
+ENCODING 8808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2269
+ENCODING 8809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni226A
+ENCODING 8810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni226B
+ENCODING 8811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni226C
+ENCODING 8812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni226D
+ENCODING 8813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+60
+80
+00
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+60
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2272
+ENCODING 8818
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+50
+A0
+ENDCHAR
+STARTCHAR uni2273
+ENCODING 8819
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2276
+ENCODING 8822
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+20
+80
+60
+C0
+ENDCHAR
+STARTCHAR uni2277
+ENCODING 8823
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+80
+20
+C0
+60
+ENDCHAR
+STARTCHAR uni2278
+ENCODING 8824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+60
+C0
+60
+C0
+ENDCHAR
+STARTCHAR uni2279
+ENCODING 8825
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+60
+C0
+60
+ENDCHAR
+STARTCHAR uni227A
+ENCODING 8826
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+C0
+20
+00
+00
+ENDCHAR
+STARTCHAR uni227B
+ENCODING 8827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+60
+80
+00
+00
+ENDCHAR
+STARTCHAR uni227C
+ENCODING 8828
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227D
+ENCODING 8829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+80
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227E
+ENCODING 8830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni227F
+ENCODING 8831
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2280
+ENCODING 8832
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2281
+ENCODING 8833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR propersubset
+ENCODING 8834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+60
+00
+00
+ENDCHAR
+STARTCHAR propersuperset
+ENCODING 8835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+C0
+00
+00
+ENDCHAR
+STARTCHAR notsubset
+ENCODING 8836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2285
+ENCODING 8837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR reflexsubset
+ENCODING 8838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR reflexsuperset
+ENCODING 8839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2288
+ENCODING 8840
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2289
+ENCODING 8841
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+40
+ENDCHAR
+STARTCHAR uni228A
+ENCODING 8842
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni228B
+ENCODING 8843
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+40
+E0
+80
+ENDCHAR
+STARTCHAR revlogicalnot
+ENCODING 8976
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+80
+00
+00
+ENDCHAR
+STARTCHAR integraltp
+ENCODING 8992
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR integralbt
+ENCODING 8993
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+20
+20
+40
+ENDCHAR
+STARTCHAR uni23BA
+ENCODING 9146
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BB
+ENCODING 9147
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BC
+ENCODING 9148
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni23BD
+ENCODING 9149
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2409
+ENCODING 9225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240A
+ENCODING 9226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+60
+40
+40
+ENDCHAR
+STARTCHAR uni240B
+ENCODING 9227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240C
+ENCODING 9228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+80
+60
+60
+40
+ENDCHAR
+STARTCHAR uni240D
+ENCODING 9229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+E0
+50
+60
+50
+ENDCHAR
+STARTCHAR uni2423
+ENCODING 9251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+90
+F0
+ENDCHAR
+STARTCHAR uni2424
+ENCODING 9252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+B0
+90
+20
+20
+30
+ENDCHAR
+STARTCHAR SF100000
+ENCODING 9472
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2501
+ENCODING 9473
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+00
+00
+ENDCHAR
+STARTCHAR SF110000
+ENCODING 9474
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2503
+ENCODING 9475
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR uni2504
+ENCODING 9476
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2505
+ENCODING 9477
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni2506
+ENCODING 9478
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2507
+ENCODING 9479
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR uni2508
+ENCODING 9480
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2509
+ENCODING 9481
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni250A
+ENCODING 9482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni250B
+ENCODING 9483
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR SF010000
+ENCODING 9484
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250D
+ENCODING 9485
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250E
+ENCODING 9486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR uni250F
+ENCODING 9487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF030000
+ENCODING 9488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2511
+ENCODING 9489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2512
+ENCODING 9490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2513
+ENCODING 9491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF020000
+ENCODING 9492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2515
+ENCODING 9493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2516
+ENCODING 9494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2517
+ENCODING 9495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR SF040000
+ENCODING 9496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2519
+ENCODING 9497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni251A
+ENCODING 9498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni251B
+ENCODING 9499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF080000
+ENCODING 9500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251D
+ENCODING 9501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251E
+ENCODING 9502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251F
+ENCODING 9503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2520
+ENCODING 9504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2521
+ENCODING 9505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni2522
+ENCODING 9506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2523
+ENCODING 9507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF090000
+ENCODING 9508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2525
+ENCODING 9509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2526
+ENCODING 9510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni2527
+ENCODING 9511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2528
+ENCODING 9512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2529
+ENCODING 9513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni252A
+ENCODING 9514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni252B
+ENCODING 9515
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF060000
+ENCODING 9516
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252D
+ENCODING 9517
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252E
+ENCODING 9518
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252F
+ENCODING 9519
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2530
+ENCODING 9520
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2531
+ENCODING 9521
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2532
+ENCODING 9522
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2533
+ENCODING 9523
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF070000
+ENCODING 9524
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2535
+ENCODING 9525
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2536
+ENCODING 9526
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2537
+ENCODING 9527
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2538
+ENCODING 9528
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2539
+ENCODING 9529
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253A
+ENCODING 9530
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253B
+ENCODING 9531
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF050000
+ENCODING 9532
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253D
+ENCODING 9533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253E
+ENCODING 9534
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253F
+ENCODING 9535
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2540
+ENCODING 9536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2541
+ENCODING 9537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2542
+ENCODING 9538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2543
+ENCODING 9539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2544
+ENCODING 9540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2545
+ENCODING 9541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2546
+ENCODING 9542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2547
+ENCODING 9543
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2548
+ENCODING 9544
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2549
+ENCODING 9545
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254A
+ENCODING 9546
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254B
+ENCODING 9547
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254C
+ENCODING 9548
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254D
+ENCODING 9549
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254E
+ENCODING 9550
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+00
+40
+40
+ENDCHAR
+STARTCHAR uni254F
+ENCODING 9551
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR SF430000
+ENCODING 9552
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF240000
+ENCODING 9553
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR SF510000
+ENCODING 9554
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF520000
+ENCODING 9555
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR SF390000
+ENCODING 9556
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF220000
+ENCODING 9557
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF210000
+ENCODING 9558
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF250000
+ENCODING 9559
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF500000
+ENCODING 9560
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF490000
+ENCODING 9561
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR SF380000
+ENCODING 9562
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF280000
+ENCODING 9563
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+00
+ENDCHAR
+STARTCHAR SF270000
+ENCODING 9564
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF260000
+ENCODING 9565
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR SF360000
+ENCODING 9566
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF370000
+ENCODING 9567
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR SF420000
+ENCODING 9568
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF190000
+ENCODING 9569
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF200000
+ENCODING 9570
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF230000
+ENCODING 9571
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF470000
+ENCODING 9572
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+40
+ENDCHAR
+STARTCHAR SF480000
+ENCODING 9573
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF410000
+ENCODING 9574
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR SF450000
+ENCODING 9575
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF460000
+ENCODING 9576
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF400000
+ENCODING 9577
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF540000
+ENCODING 9578
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+40
+F0
+40
+ENDCHAR
+STARTCHAR SF530000
+ENCODING 9579
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF440000
+ENCODING 9580
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR uni256D
+ENCODING 9581
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+30
+40
+40
+ENDCHAR
+STARTCHAR uni256E
+ENCODING 9582
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+80
+40
+40
+ENDCHAR
+STARTCHAR uni256F
+ENCODING 9583
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+80
+00
+00
+ENDCHAR
+STARTCHAR uni2570
+ENCODING 9584
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+30
+00
+00
+ENDCHAR
+STARTCHAR uni2571
+ENCODING 9585
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+20
+40
+40
+80
+ENDCHAR
+STARTCHAR uni2572
+ENCODING 9586
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+20
+20
+10
+ENDCHAR
+STARTCHAR uni2573
+ENCODING 9587
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+60
+90
+90
+ENDCHAR
+STARTCHAR uni2574
+ENCODING 9588
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2575
+ENCODING 9589
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2576
+ENCODING 9590
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2577
+ENCODING 9591
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2578
+ENCODING 9592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2579
+ENCODING 9593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+00
+00
+ENDCHAR
+STARTCHAR uni257A
+ENCODING 9594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni257B
+ENCODING 9595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257C
+ENCODING 9596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+30
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257D
+ENCODING 9597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257E
+ENCODING 9598
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257F
+ENCODING 9599
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+40
+40
+ENDCHAR
+STARTCHAR upblock
+ENCODING 9600
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2581
+ENCODING 9601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2582
+ENCODING 9602
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F8
+ENDCHAR
+STARTCHAR uni2583
+ENCODING 9603
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F8
+F8
+ENDCHAR
+STARTCHAR dnblock
+ENCODING 9604
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2585
+ENCODING 9605
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2586
+ENCODING 9606
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2587
+ENCODING 9607
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR block
+ENCODING 9608
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2589
+ENCODING 9609
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni258A
+ENCODING 9610
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni258B
+ENCODING 9611
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR lfblock
+ENCODING 9612
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258D
+ENCODING 9613
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258E
+ENCODING 9614
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR uni258F
+ENCODING 9615
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR rtblock
+ENCODING 9616
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ltshade
+ENCODING 9617
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+80
+20
+80
+20
+ENDCHAR
+STARTCHAR shade
+ENCODING 9618
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A8
+50
+A8
+50
+A8
+50
+ENDCHAR
+STARTCHAR dkshade
+ENCODING 9619
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B8
+E8
+B8
+E8
+B8
+E8
+ENDCHAR
+STARTCHAR uni2594
+ENCODING 9620
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2595
+ENCODING 9621
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR filledbox
+ENCODING 9632
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR H22073
+ENCODING 9633
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uni25C6
+ENCODING 9670
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR spade
+ENCODING 9824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR club
+ENCODING 9827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+E0
+00
+ENDCHAR
+STARTCHAR heart
+ENCODING 9829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR diamond
+ENCODING 9830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2669
+ENCODING 9833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnote
+ENCODING 9834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnotedbl
+ENCODING 9835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+50
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266C
+ENCODING 9836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+70
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266D
+ENCODING 9837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni266E
+ENCODING 9838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+A0
+E0
+20
+00
+ENDCHAR
+STARTCHAR uni266F
+ENCODING 9839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uniFFFD
+ENCODING 65533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+90
+D0
+F0
+D0
+F0
+ENDCHAR
+ENDFONT
diff --git a/src/col64/cruft/col64font.hex b/src/col64/cruft/col64font.hex
new file mode 100644
index 0000000..6b88e9b
--- /dev/null
+++ b/src/col64/cruft/col64font.hex
@@ -0,0 +1,920 @@
+0000:A000A000A000
+0020:000000000000
+0021:404040004000
+0022:A0A000000000
+0023:A0F0A0F0A000
+0024:70A06050E000
+0025:009020409000
+0026:40A040A0D000
+0027:202040000000
+0028:204040402000
+0029:402020204000
+002A:A040E040A000
+002B:4040E0404000
+002C:000000204000
+002D:0000F0000000
+002E:000000004000
+002F:202040808000
+0030:6090B0D06000
+0031:40C04040E000
+0032:60902040F000
+0033:E0106010E000
+0034:2060A0F02000
+0035:F080E010E000
+0036:7080E0906000
+0037:F01020404000
+0038:609060906000
+0039:60907010E000
+003A:004000004000
+003B:002000204000
+003C:204080402000
+003D:00F000F00000
+003E:804020408000
+003F:709020002000
+0040:60B0B0806000
+0041:6090F0909000
+0042:E090E090E000
+0043:609080906000
+0044:E0909090E000
+0045:F080E080F000
+0046:F080E0808000
+0047:7080B0906000
+0048:9090F0909000
+0049:E0404040E000
+004A:301010906000
+004B:90A0C0A09000
+004C:80808080F000
+004D:A0F0D0909000
+004E:90D0B0909000
+004F:609090906000
+0050:E090E0808000
+0051:609090A05000
+0052:E090E0A09000
+0053:70806010E000
+0054:F04040404000
+0055:909090906000
+0056:909090A04000
+0057:9090D0F0A000
+0058:909060909000
+0059:909060204000
+005A:F0204080F000
+005B:604040406000
+005C:808040202000
+005D:602020206000
+005E:40A000000000
+005F:00000000F000
+0060:404020000000
+0061:003050907000
+0062:8080E090E000
+0063:007080807000
+0064:101070907000
+0065:006090A07000
+0066:6040E0404000
+0067:709070106000
+0068:8080E0909000
+0069:4000C040E000
+006A:20006020C000
+006B:80A0C0A09000
+006C:C0404040E000
+006D:00A0F0D09000
+006E:00E090909000
+006F:006090906000
+0070:00E090E08000
+0071:007090701000
+0072:00A0D0808000
+0073:0070C030E000
+0074:40E040402000
+0075:009090906000
+0076:009090A04000
+0077:0090D0F0A000
+0078:009060609000
+0079:00906020C000
+007A:00F02040F000
+007B:604080406000
+007C:404040404000
+007D:C0402040C000
+007E:0050A0000000
+007F:B0900090D000
+00A0:000000000000
+00A1:400040404000
+00A2:40E080E04000
+00A3:20406040A000
+00A4:009060609000
+00A5:A040E0404000
+00A6:404000404000
+00A7:60C0A06020C0
+00A8:A00000000000
+00A9:6090D0D09060
+00AA:60A06000E000
+00AB:0050A0500000
+00AC:0000E0200000
+00AD:0000E0000000
+00AE:60F0D0600000
+00AF:E00000000000
+00B0:40A040000000
+00B1:40E04000E000
+00B2:C04080C00000
+00B3:C04080408000
+00B4:204000000000
+00B5:00A0A0A0C080
+00B6:70D0D0505000
+00B7:000040000000
+00B8:000000204000
+00B9:40C040400000
+00BA:40A04000E000
+00BB:00A050A00000
+00BC:808080507010
+00BD:8080B0102030
+00BE:C0408050B010
+00BF:400040806000
+00C0:8040A0E0A000
+00C1:2040A0E0A000
+00C2:C040A0E0A000
+00C3:60C0A0E0A000
+00C4:A040A0E0A000
+00C5:4040A0E0A000
+00C6:70A0F0A0B000
+00C7:40A080A04080
+00C8:80E0C080E000
+00C9:20E0C080E000
+00CA:60E0C080E000
+00CB:A0E0C080E000
+00CC:80E04040E000
+00CD:20E04040E000
+00CE:40E04040E000
+00CF:A0404040E000
+00D0:E050D050E000
+00D1:50A0E0E0A000
+00D2:8040A0A04000
+00D3:2040A0A04000
+00D4:4040A0A04000
+00D5:70E0A0A04000
+00D6:A040A0A04000
+00D7:00A040A00000
+00D8:60A0E0A0C000
+00D9:8040A0A0E000
+00DA:2040A0A0E000
+00DB:4000A0A0E000
+00DC:A000A0A0E000
+00DD:2000A0404000
+00DE:80C0A0C08000
+00DF:40A0C0A0E080
+00E0:804060A06000
+00E1:204060A06000
+00E2:600060A06000
+00E3:50A060A06000
+00E4:A00060A06000
+00E5:400060A06000
+00E6:0070B0A07000
+00E7:0040A0806040
+00E8:8040A0C06000
+00E9:2040A0C06000
+00EA:C040A0C06000
+00EB:A040A0C06000
+00EC:80404040E000
+00ED:20C04040E000
+00EE:40A04040E000
+00EF:A000C040E000
+00F0:A04060A04000
+00F1:50A0C0A0A000
+00F2:804040A04000
+00F3:204040A04000
+00F4:400040A04000
+00F5:E00040A04000
+00F6:A00040A04000
+00F7:4000E0004000
+00F8:0060A0A0C000
+00F9:8040A0A06000
+00FA:2040A0A06000
+00FB:4000A0A06000
+00FC:A000A0A06000
+00FD:2040A0E020C0
+00FE:8080C0A0C080
+00FF:A000A0E020C0
+0100:E040A0E0A000
+0101:E00060A06000
+0102:A040A0E0A000
+0103:A04060A06000
+0104:0040A0E0A020
+0105:000060A06020
+0106:60A080A04000
+0107:2040A0806000
+0108:E0A080A04000
+0109:600060806000
+010A:40E080A04000
+010B:400060806000
+010C:E0A080A04000
+010D:A04060806000
+010E:E0C0A0A0C000
+010F:302060A06000
+0110:C0A0E0A0C000
+0111:602060A06000
+0112:E0E0C080E000
+0113:E040A0C06000
+0114:A0E0C080E000
+0115:A040A0C06000
+0116:40E0C080E000
+0117:4040A0C06000
+0118:E080C080E020
+0119:0040A0C06040
+011A:A0E0C080E000
+011B:A040A0C06000
+011C:606080A06000
+011D:6060A06020C0
+011E:A06080A06000
+011F:A040A06020C0
+0120:406080A06000
+0121:4060A06020C0
+0122:6080A0A04040
+0123:4060A06020C0
+0124:6000A0E0A000
+0125:40A0C0A0A000
+0126:A0E0A0E0A000
+0127:80C0C0A0A000
+0128:50A04040E000
+0129:50A0C040E000
+012A:E000E040E000
+012B:E000C040E000
+012C:A040E040E000
+012D:A040C040E000
+012E:E0404040E020
+012F:4000C040E020
+0130:4000E040E000
+0131:0000C040E000
+0132:80A0A0A02060
+0133:A000A0A02040
+0134:60A020A04000
+0135:40A0002020C0
+0136:A0A0C0A02040
+0137:80A0C0A02040
+0138:00A0A0C0A000
+0139:40808080E000
+013A:20C04040E000
+013B:80808080E020
+013C:C0404040E020
+013D:A0C08080E000
+013E:D0404040E000
+013F:8080A080E000
+0140:C0405040E000
+0141:80A0C080E000
+0142:C060C040E000
+0143:20A0E0A08000
+0144:2040C0A0A000
+0145:20A0E0A08020
+0146:00C0A0A00040
+0147:20A0E0A08000
+0148:A040C0A0A000
+0149:8000C0A0A000
+014A:A0E0E0A02040
+014B:00C0A0A02040
+014C:E040A0A04000
+014D:E00040A04000
+014E:A040A0A04000
+014F:A04040A04000
+0150:A040A0A04000
+0151:A0A040A04000
+0152:50A0B0A07000
+0153:0070B0A07000
+0154:20C0A0C0A000
+0155:2000A0C08000
+0156:C0A0C0A00040
+0157:00A0C0808020
+0158:60C0A0C0A000
+0159:6000A0C08000
+015A:2060C020C000
+015B:2060C020C000
+015C:6060C020C000
+015D:6060C020C000
+015E:60804020C040
+015F:0060C020E040
+0160:6060C020E000
+0161:6060C020C000
+0162:E04040402040
+0163:40E040402040
+0164:A040E0404000
+0165:A040E0402000
+0166:E040E0404000
+0167:E040E0402000
+0168:D020A0A0E000
+0169:50A000A06000
+016A:E000A0A0E000
+016B:E000A0A06000
+016C:A040A0A0E000
+016D:A04000A06000
+016E:4000A0A0E000
+016F:4000A0A06000
+0170:A000A0A0E000
+0171:A000A0A06000
+0172:00A0A0A04020
+0173:00A0A0A06040
+0174:40A0A0E0A000
+0175:4000A0E0E000
+0176:6000A0404000
+0177:4000A0408000
+0178:A000A0404000
+0179:40E04080E000
+017A:40E04080E000
+017B:40E04080E000
+017C:40E04080E000
+017D:A0E04080E000
+017E:A0E04080E000
+017F:2040C0404000
+018F:00C060A04000
+0192:2040E0404080
+0218:60804020C040
+0219:0060C020E040
+021A:E04040400040
+021B:40E040402040
+0259:00C060A04000
+02C6:40A000000000
+02C7:A04000000000
+02C9:E00000000000
+02D8:906000000000
+02D9:400000000000
+02DA:40A040000000
+02DB:0000004080C0
+02DC:50A000000000
+02DD:A0A000000000
+0374:204000000000
+0375:000000004080
+037A:000000004060
+037E:004000004080
+0384:204000000000
+0385:B04000000000
+0386:C0A0E0A0A000
+0387:000040000000
+0388:E0C060406000
+0389:A020E0A0A000
+038A:E0C04040E000
+038C:C0A0A0A04000
+038E:A0A0C0404000
+038F:C0A0A040A000
+0390:B04000402000
+0391:40A0E0A0A000
+0392:C0A0C0A0C000
+0393:E08080808000
+0394:4040A0A0E000
+0395:E080C080E000
+0396:E0204080E000
+0397:A0A0E0A0A000
+0398:40A0E0A04000
+0399:E0404040E000
+039A:A0A0C0A0A000
+039B:4040A0A0A000
+039C:A0E0A0A0A000
+039D:20A0E0A08000
+039E:E0004000E000
+039F:40A0A0A04000
+03A0:E0A0A0A0A000
+03A1:C0A0C0808000
+03A3:E0804080E000
+03A4:E04040404000
+03A5:A0A040404000
+03A6:40E0A0E04000
+03A7:A0A040A0A000
+03A8:A0E0E0404000
+03A9:40A0A040A000
+03AA:A000E040E000
+03AB:A000A0404000
+03AC:408060A06000
+03AD:20C040806000
+03AE:2040C0A02040
+03AF:200040402000
+03B0:B040A0A0C000
+03B1:0050A0A05000
+03B2:40A0C0A0C000
+03B3:00A060404000
+03B4:608040A04000
+03B5:00E0C0806000
+03B6:E04080E02040
+03B7:00C0A0A02040
+03B8:40A0E0A04000
+03B9:004040402000
+03BA:00A0A0C0A000
+03BB:C02060A0A000
+03BC:00A0A0A0C080
+03BD:00A0A0604000
+03BE:60A040806000
+03BF:0040A0A04000
+03C0:00E0A0A0A000
+03C1:0040A0A0C080
+03C2:00608040C000
+03C3:0060C0A04000
+03C4:00E040402000
+03C5:0080A0A0C000
+03C6:0040E0A04040
+03C7:00A04060A000
+03C8:00A0E0E04000
+03C9:00A0A0E0E000
+03CA:A00040402000
+03CB:A000A0A0C000
+03CC:204040A04000
+03CD:2000A0A0C000
+03CE:2000A0E0E000
+0401:A0E0C080E000
+0402:E080C0A0A000
+0403:20E080808000
+0404:6080C0806000
+0405:60804020C000
+0406:E0404040E000
+0407:A0E04040E000
+0408:202020A04000
+0409:E060A0B0B000
+040A:A0A0E0B0B000
+040B:C080C0A0A000
+040C:2080A0C0A000
+040E:A04000A04080
+040F:A0A0A0A0E040
+0410:40A0E0A0A000
+0411:E080C0A0C000
+0412:C0A0C0A0C000
+0413:E08080808000
+0414:E060A0A0E0A0
+0415:E080C080E000
+0416:A0E040E0A000
+0417:C0204020C000
+0418:80A0E0A02000
+0419:6080A0E0A020
+041A:A0A0C0A0A000
+041B:60A0A0A0A000
+041C:A0E0A0A0A000
+041D:A0A0E0A0A000
+041E:40A0A0A04000
+041F:E0A0A0A0A000
+0420:C0A0C0808000
+0421:40A080A04000
+0422:E04040404000
+0423:A0A0A0404080
+0424:40E0A0E04000
+0425:A0A040A0A000
+0426:A0A0A0A0E000
+0427:A0A060202000
+0428:A0A0E0E0E000
+0429:A0A0E0E0F010
+042A:C04060506000
+042B:9090D0B0D000
+042C:8080C0A0C000
+042D:C0206020C000
+042E:A0D0D0D0A000
+042F:60A060A0A000
+0430:0060A0A06000
+0431:6080E0A04000
+0432:00E0C0A0C000
+0433:00E080808000
+0434:0060A0A0E0A0
+0435:0040A0C06000
+0436:00B06060B000
+0437:00E04020C000
+0438:00A0E0E0A000
+0439:A040A0E0A000
+043A:00A0A0C0A000
+043B:0060A0A0A000
+043C:00A0E0A0A000
+043D:00A0E0A0A000
+043E:0040A0A04000
+043F:00E0A0A0A000
+0440:00C0A0C08080
+0441:006080806000
+0442:00E040404000
+0443:00A0A06020C0
+0444:4040A0A04040
+0445:00A04040A000
+0446:00A0A0A0E020
+0447:00A0A0602000
+0448:00A0E0E0E000
+0449:00A0E0E0F010
+044A:00C060506000
+044B:0090D0B0D000
+044C:0080C0A0C000
+044D:00C06020C000
+044E:00A0D0D0A000
+044F:0060A060A000
+0451:A040A0C06000
+0452:80C080C0A020
+0453:2040E0808000
+0454:0060C0806000
+0455:0060C020C000
+0456:4000C040E000
+0457:A000C040E000
+0458:2000202020C0
+0459:0060A0B0B000
+045A:00A0E0B0B000
+045B:80C080C0A000
+045C:2080A0C0A000
+045E:A04000A04080
+045F:00A0A0A0E040
+0490:20E080808000
+0491:0020E0808000
+0492:6040E0404000
+0493:006040E04000
+05D0:00A060C0A000
+05D1:00E02020F000
+05D2:80404040A000
+05D3:00E020202000
+05D4:80E020A0A000
+05D5:402020202000
+05D6:806040404000
+05D7:00E0A0A0A000
+05D8:A0A0A0A0C000
+05D9:C02020000000
+05DA:00E020202020
+05DB:00E02020C000
+05DC:80E020204000
+05DD:8060A0A0E000
+05DE:8060A0A0A000
+05DF:806020202000
+05E0:402020206000
+05E1:8060A0A04000
+05E2:A0A0A060C000
+05E3:00E0A0202020
+05E4:00E0A020E000
+05E5:00A0A0C08080
+05E6:00A04020E000
+05E7:00E020C08080
+05E8:00C020202000
+05E9:00F0D0A0E000
+05EA:8060A0A0A000
+1E02:40E0C0A0C000
+1E03:A080C0A0C000
+1E0A:40C0A0A0C000
+1E0B:A02060A06000
+1E1E:40E080C08000
+1E1F:802040E04000
+1E40:4000E0A0A000
+1E41:4000A0E0A000
+1E56:40C0A0C08000
+1E57:4000C0A0C080
+1E60:40E0C020C000
+1E61:4060C020C000
+1E6A:40E040404000
+1E6B:400040E04020
+1E80:8020A0E0E000
+1E81:8040A0A0E000
+1E82:2080A0E0E000
+1E83:2040A0A0E000
+1E84:A000A0E0E000
+1E85:A000A0E0E000
+1EF2:8020A0404000
+1EF3:8040A0602040
+2010:000060000000
+2011:000060000000
+2012:0000E0000000
+2013:0000E0000000
+2014:0000F0000000
+2015:0000F0000000
+2016:A0A0A0A0A0A0
+2017:000000F000F0
+2018:204060000000
+2019:602040000000
+201A:000000602040
+201B:604020000000
+201C:50A0A0000000
+201D:5050A0000000
+201E:0000005050A0
+201F:A0A050000000
+2020:40E040404000
+2021:40E040E04000
+2022:0040E0400000
+2023:00C0E0C00000
+2024:000000004000
+2025:00000000A000
+2026:00000000B000
+2027:000040000000
+2030:802040803000
+2039:004080400000
+203A:004020400000
+203E:F80000000000
+207F:00C0A0A00000
+20A7:60F060404000
+20AC:2040E0402000
+2116:C0B0B0A0B000
+2122:E04000E0A000
+2126:40A0A040A000
+2127:A040A0A04000
+215B:8080B0205020
+215C:C040B060D020
+215D:C08070A05020
+215E:C040B0A05020
+2190:0040F0400000
+2191:0040E0404000
+2192:0020F0200000
+2193:004040E04000
+2194:0050F0500000
+2195:40E040E04000
+2200:A0A0E0A04000
+2201:40A080A04000
+2202:C02060A04000
+2203:E020E020E000
+2204:F020E060E080
+2205:2060A0A0C080
+2206:4040A0A0E000
+2207:E0A0A0404000
+2208:6080E0806000
+2209:70A0E0A06040
+220A:4080C0804000
+220B:C020E020C000
+220C:D020E060C080
+220D:8040C0408000
+220E:C0C0C0C0C000
+220F:E0A0A0A0A000
+2210:A0A0A0A0E000
+2211:E0804080E000
+2212:0000E0000000
+2213:E00040E04000
+2214:400040E04000
+2215:202040808000
+2216:808040202000
+2217:20A070E05040
+2218:0040A0400000
+2219:0040E0400000
+221A:302020A06000
+221B:D050D0105030
+221C:D0D050105030
+221D:000050E05000
+221E:0020D0B04000
+221F:00008080E000
+2220:00204080E000
+2221:10A040A0F020
+2222:9060A0A06090
+2223:404040404000
+2224:406040C04000
+2225:A0A0A0A0A000
+2226:A0B0E0A0A000
+2227:004040A0A000
+2228:00A0A0404000
+2229:0040A0A0A000
+222A:00A0A0A04000
+222B:204040404080
+222C:50A0A0A0A080
+222D:50D0D0D0D0A0
+222E:2040E0E04080
+222F:50A0E0E0A080
+2230:50D0F0F0D0A0
+2231:2040E0504080
+2232:2040E0C04080
+2233:2040C0E04080
+2234:00004000A000
+2235:0000A0004000
+2236:000040004000
+2237:0000A000A000
+2238:004000E00000
+2239:000020C02000
+223A:A000E000A000
+223B:200050A00040
+223C:000050A00000
+223D:0000A0500000
+223E:0000D0B00000
+223F:004050A02000
+2240:402040402000
+2241:1020B0D04080
+2242:00E000A05000
+2243:0050A000E000
+2244:20D0B040F040
+2245:50A000E000E0
+2246:50A020F040F0
+2247:70A020F040F0
+2248:50A00050A000
+2249:70A04050E080
+224A:40B040B000F0
+224B:40B040B040B0
+224C:A05000E000E0
+224D:A0400040A000
+224E:40A000A04000
+224F:40A000E00000
+2250:4000E000E000
+2251:40E000E00040
+2252:80E000E00020
+2253:20E000E00080
+2254:00B000B00000
+2255:00D000D00000
+2256:00E040E00000
+2257:40E000E00000
+2258:40E000E00000
+2259:40E000E00000
+225A:A0E000E00000
+225B:40E000E00000
+225C:40E000E00000
+225D:4000E000E000
+225E:4000E000E000
+225F:4000E000E000
+2260:20E040E08000
+2261:E000E000E000
+2262:E020E040E080
+2263:E000E000E000
+2264:2040E000E000
+2265:8040E000E000
+2266:2040E000E000
+2267:8040E000E000
+2268:002040E00000
+2269:008040E00000
+226A:0050A0500000
+226B:00A050A00000
+226C:A040A040A000
+226D:20E040E08000
+226E:2060C0608000
+226F:20C060C08000
+2270:2040E040E080
+2271:A060E040E080
+2272:2040E00050A0
+2273:8040E000A050
+2276:60C0208060C0
+2277:C0608020C060
+2278:60C060C060C0
+2279:C060C060C060
+227A:0020C0200000
+227B:008060800000
+227C:20C02000E000
+227D:80608000E000
+227E:20C02000A050
+227F:20C02000A050
+2280:4060C0604000
+2281:40C060C04000
+2282:006080600000
+2283:00C020C00000
+2284:4060C0604000
+2285:40C060C04000
+2286:60806000E000
+2287:C020C000E000
+2288:60A06040E080
+2289:C060C040E040
+228A:60806040E080
+228B:C020C040E080
+2310:0000E0800000
+2320:204040404040
+2321:202020202040
+23BA:F00000000000
+23BB:00F000000000
+23BC:000000F00000
+23BD:0000000000F0
+2409:A0E0A0702020
+240A:8080E0604040
+240B:A0A040702020
+240C:C0C080606040
+240D:E080E0506050
+2423:0000000090F0
+2424:D0B090202030
+2500:000000F00000
+2501:0000F8F80000
+2502:404040404040
+2503:606060606060
+2504:000000A00000
+2505:0000A8A80000
+2506:400040004000
+2507:600060006000
+2508:000000A00000
+2509:0000A8A80000
+250A:400040004000
+250B:600060006000
+250C:000000704040
+250D:000070704040
+250E:000000706060
+250F:000070706060
+2510:000000C04040
+2511:0000C0C04040
+2512:000000E06060
+2513:0000E0E06060
+2514:404040700000
+2515:404070700000
+2516:606060700000
+2517:606070700000
+2518:404040C00000
+2519:4040C0C00000
+251A:606060E00000
+251B:6060E0E00000
+251C:404040704040
+251D:404070704040
+251E:606060704040
+251F:404040706060
+2520:606060706060
+2521:606070704040
+2522:404070706060
+2523:606070706060
+2524:404040C04040
+2525:4040C0C04040
+2526:606060E04040
+2527:404040E06060
+2528:606060E06060
+2529:6060E0E04040
+252A:4040E0E06060
+252B:6060E0E06060
+252C:000000F04040
+252D:0000C0F04040
+252E:000070F04040
+252F:0000F0F04040
+2530:000000F06060
+2531:0000E0F06060
+2532:000070F06060
+2533:0000F0F06060
+2534:404040F00000
+2535:4040C0F00000
+2536:404070F00000
+2537:4040F0F00000
+2538:606060F00000
+2539:6060E0F00000
+253A:606070F00000
+253B:6060F0F00000
+253C:404040F04040
+253D:4040C0F04040
+253E:404070F04040
+253F:4040F0F04040
+2540:606060F04040
+2541:404040F06060
+2542:606060F06060
+2543:6060E0F04040
+2544:606070F04040
+2545:4040E0F06060
+2546:404070F06060
+2547:6060F0F04040
+2548:4040F0F06060
+2549:6060E0F06060
+254A:606070F06060
+254B:6060F0F06060
+254C:000000A00000
+254D:0000A0A00000
+254E:004040004040
+254F:006060006060
+2550:0000F000F000
+2551:606060606060
+2552:000070407040
+2553:000000706060
+2554:000070407060
+2555:0000C040C040
+2556:000000E06060
+2557:0000E020E060
+2558:404070407000
+2559:606060700000
+255A:606070407000
+255B:4040C040C000
+255C:606060E00000
+255D:6060E020E000
+255E:404070407040
+255F:606060706060
+2560:606070407060
+2561:4040C040C040
+2562:606060E06060
+2563:6060E020E060
+2564:0000F000F040
+2565:000000F06060
+2566:0000F000F060
+2567:4040F000F000
+2568:606060F00000
+2569:6060F000F000
+256A:4040F040F040
+256B:606060F06060
+256C:6060F000F060
+256D:000000304040
+256E:000000804040
+256F:404040800000
+2570:404040300000
+2571:102020404080
+2572:804040202010
+2573:909060609090
+2574:000000C00000
+2575:404040400000
+2576:000000700000
+2577:000000404040
+2578:0000C0C00000
+2579:606060600000
+257A:000070700000
+257B:000000606060
+257C:000030F00000
+257D:404040606060
+257E:0000C0F00000
+257F:606060604040
+2580:F8F8F8000000
+2581:0000000000F0
+2582:0000000000F8
+2583:00000000F8F8
+2584:000000F8F8F8
+2585:000000F8F8F8
+2586:0000F8F8F8F8
+2587:00F8F8F8F8F8
+2588:F8F8F8F8F8F8
+2589:F0F0F0F0F0F0
+258A:E0E0E0E0E0E0
+258B:E0E0E0E0E0E0
+258C:C0C0C0C0C0C0
+258D:C0C0C0C0C0C0
+258E:808080808080
+258F:808080808080
+2590:303030303030
+2591:802080208020
+2592:A850A850A850
+2593:B8E8B8E8B8E8
+2594:F80000000000
+2595:101010101010
+25A0:0000E0E0E000
+25A1:0000E0A0E000
+25C6:0040E0E04000
+2660:40E0E040E000
+2663:0040A040E000
+2665:00A0E0E04000
+2666:0040E0400000
+2669:404040C08000
+266A:406040C08000
+266B:70505050A000
+266C:70705050A000
+266D:8080E0A0C000
+266E:80E0A0E02000
+266F:A0E0A0E0A000
+FFFD:F090D0F0D0F0
diff --git a/src/col64/cruft/col64font_almost.bdf b/src/col64/cruft/col64font_almost.bdf
new file mode 100644
index 0000000..9ff776c
--- /dev/null
+++ b/src/col64/cruft/col64font_almost.bdf
@@ -0,0 +1,11994 @@
+STARTFONT 2.1
+COMMENT Contributed by Janne V. Kujala <jvk@iki.fi>
+COMMENT $Id: 4x6.bdf,v 1.5 2002-08-26 18:05:49+01 mgk25 Rel $
+COMMENT Send bug reports to Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+FONT -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1
+SIZE 6 75 75
+FONTBOUNDINGBOX 4 6 0 -1
+STARTPROPERTIES 23
+FONTNAME_REGISTRY ""
+FOUNDRY "Misc"
+FAMILY_NAME "Fixed"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 6
+POINT_SIZE 60
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 40
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 5
+FONT_DESCENT 1
+DESTINATION 1
+COPYRIGHT "Public domain font. Share and enjoy."
+CAP_HEIGHT 5
+X_HEIGHT 4
+DEFAULT_CHAR 0
+_GBDFED_INFO "Edited with gbdfed 1.4."
+ENDPROPERTIES
+CHARS 920
+STARTCHAR char0
+ENCODING 0
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+A0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+60
+50
+E0
+00
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+20
+40
+90
+00
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+A0
+D0
+00
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+A0
+00
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+B0
+D0
+60
+00
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+10
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+F0
+20
+00
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+10
+E0
+00
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+E0
+90
+60
+00
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+10
+20
+40
+40
+00
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+60
+90
+60
+00
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+70
+10
+E0
+00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+80
+40
+20
+00
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+20
+40
+80
+00
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+20
+00
+20
+00
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+B0
+B0
+80
+60
+00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+80
+90
+60
+00
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+90
+90
+E0
+00
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+F0
+00
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+B0
+90
+60
+00
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+10
+10
+90
+60
+00
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+F0
+00
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+D0
+90
+90
+00
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+D0
+B0
+90
+90
+00
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+A0
+50
+00
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+A0
+90
+00
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+90
+90
+00
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+40
+80
+F0
+00
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+40
+40
+60
+00
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F0
+00
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+10
+70
+90
+70
+00
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+80
+80
+70
+00
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+70
+90
+70
+00
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+A0
+70
+00
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+70
+10
+60
+00
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+90
+00
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+F0
+D0
+90
+00
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+90
+90
+00
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+E0
+80
+00
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+70
+10
+00
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+80
+80
+00
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+C0
+30
+E0
+00
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+80
+40
+60
+00
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+20
+40
+C0
+00
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+90
+00
+90
+D0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+E0
+40
+00
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+40
+A0
+00
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+00
+40
+40
+00
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+D0
+D0
+90
+60
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+00
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+D0
+60
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+C0
+00
+00
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+40
+80
+00
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+D0
+D0
+50
+50
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+50
+70
+10
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+10
+20
+30
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+50
+B0
+10
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+F0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+80
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+50
+D0
+50
+E0
+00
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+E0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+A0
+00
+00
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+E0
+80
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+80
+60
+40
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+40
+00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+A0
+60
+20
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+20
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+40
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+20
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+A0
+A0
+20
+60
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+20
+20
+C0
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+E0
+20
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+C0
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+A0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+50
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+20
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+40
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+00
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+A0
+20
+40
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+00
+40
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+C0
+80
+80
+20
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+E0
+00
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+20
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+60
+40
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+40
+80
+00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR longs
+ENCODING 383
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni018F
+ENCODING 399
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+40
+80
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+00
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+80
+C0
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0374
+ENCODING 884
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0375
+ENCODING 885
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR uni037A
+ENCODING 890
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+60
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR Alphatonos
+ENCODING 902
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR Epsilontonos
+ENCODING 904
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+60
+40
+60
+00
+ENDCHAR
+STARTCHAR Etatonos
+ENCODING 905
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Iotatonos
+ENCODING 906
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Omicrontonos
+ENCODING 908
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Upsilontonos
+ENCODING 910
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omegatonos
+ENCODING 911
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR iotadieresistonos
+ENCODING 912
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+40
+20
+00
+ENDCHAR
+STARTCHAR Alpha
+ENCODING 913
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Beta
+ENCODING 914
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Gamma
+ENCODING 915
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR Delta
+ENCODING 916
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Epsilon
+ENCODING 917
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zeta
+ENCODING 918
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eta
+ENCODING 919
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Theta
+ENCODING 920
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Iota
+ENCODING 921
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Kappa
+ENCODING 922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Lambda
+ENCODING 923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Mu
+ENCODING 924
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Nu
+ENCODING 925
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR Xi
+ENCODING 926
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR Omicron
+ENCODING 927
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Pi
+ENCODING 928
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Rho
+ENCODING 929
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR Sigma
+ENCODING 931
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Tau
+ENCODING 932
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Upsilon
+ENCODING 933
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Phi
+ENCODING 934
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR Chi
+ENCODING 935
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Psi
+ENCODING 936
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 937
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR Iotadieresis
+ENCODING 938
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Upsilondieresis
+ENCODING 939
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR alphatonos
+ENCODING 940
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR epsilontonos
+ENCODING 941
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR etatonos
+ENCODING 942
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR iotatonos
+ENCODING 943
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresistonos
+ENCODING 944
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR alpha
+ENCODING 945
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+A0
+50
+00
+ENDCHAR
+STARTCHAR beta
+ENCODING 946
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR gamma
+ENCODING 947
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR delta
+ENCODING 948
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR epsilon
+ENCODING 949
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR zeta
+ENCODING 950
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+80
+E0
+20
+40
+ENDCHAR
+STARTCHAR eta
+ENCODING 951
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR theta
+ENCODING 952
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR iota
+ENCODING 953
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR kappa
+ENCODING 954
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR lambda
+ENCODING 955
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR nu
+ENCODING 957
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+40
+00
+ENDCHAR
+STARTCHAR xi
+ENCODING 958
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR omicron
+ENCODING 959
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR pi
+ENCODING 960
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR rho
+ENCODING 961
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR sigma1
+ENCODING 962
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+40
+C0
+00
+ENDCHAR
+STARTCHAR sigma
+ENCODING 963
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+A0
+40
+00
+ENDCHAR
+STARTCHAR tau
+ENCODING 964
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilon
+ENCODING 965
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR phi
+ENCODING 966
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+A0
+40
+40
+ENDCHAR
+STARTCHAR chi
+ENCODING 967
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+60
+A0
+00
+ENDCHAR
+STARTCHAR psi
+ENCODING 968
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR omega
+ENCODING 969
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR iotadieresis
+ENCODING 970
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresis
+ENCODING 971
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omicrontonos
+ENCODING 972
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR upsilontonos
+ENCODING 973
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omegatonos
+ENCODING 974
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10023
+ENCODING 1025
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10051
+ENCODING 1026
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10052
+ENCODING 1027
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10053
+ENCODING 1028
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10054
+ENCODING 1029
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10055
+ENCODING 1030
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10056
+ENCODING 1031
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10057
+ENCODING 1032
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10058
+ENCODING 1033
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10059
+ENCODING 1034
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10060
+ENCODING 1035
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10061
+ENCODING 1036
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10062
+ENCODING 1038
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10145
+ENCODING 1039
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10017
+ENCODING 1040
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10018
+ENCODING 1041
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10019
+ENCODING 1042
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10020
+ENCODING 1043
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10021
+ENCODING 1044
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10022
+ENCODING 1045
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10024
+ENCODING 1046
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10025
+ENCODING 1047
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10026
+ENCODING 1048
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+E0
+A0
+20
+00
+ENDCHAR
+STARTCHAR afii10027
+ENCODING 1049
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR afii10028
+ENCODING 1050
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10029
+ENCODING 1051
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10030
+ENCODING 1052
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10031
+ENCODING 1053
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10032
+ENCODING 1054
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10033
+ENCODING 1055
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10034
+ENCODING 1056
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10035
+ENCODING 1057
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10036
+ENCODING 1058
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10037
+ENCODING 1059
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+40
+40
+80
+ENDCHAR
+STARTCHAR afii10038
+ENCODING 1060
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii10039
+ENCODING 1061
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10040
+ENCODING 1062
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii10041
+ENCODING 1063
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+60
+20
+20
+00
+ENDCHAR
+STARTCHAR afii10042
+ENCODING 1064
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10043
+ENCODING 1065
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10044
+ENCODING 1066
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10045
+ENCODING 1067
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10046
+ENCODING 1068
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10047
+ENCODING 1069
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10048
+ENCODING 1070
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+D0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10049
+ENCODING 1071
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10065
+ENCODING 1072
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR afii10066
+ENCODING 1073
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10067
+ENCODING 1074
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10068
+ENCODING 1075
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10069
+ENCODING 1076
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10070
+ENCODING 1077
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10072
+ENCODING 1078
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+60
+60
+B0
+00
+ENDCHAR
+STARTCHAR afii10073
+ENCODING 1079
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10074
+ENCODING 1080
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10075
+ENCODING 1081
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10076
+ENCODING 1082
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10077
+ENCODING 1083
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10078
+ENCODING 1084
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10079
+ENCODING 1085
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10080
+ENCODING 1086
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10081
+ENCODING 1087
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10082
+ENCODING 1088
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii10083
+ENCODING 1089
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10084
+ENCODING 1090
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10085
+ENCODING 1091
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR afii10086
+ENCODING 1092
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR afii10087
+ENCODING 1093
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii10088
+ENCODING 1094
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+20
+ENDCHAR
+STARTCHAR afii10089
+ENCODING 1095
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+00
+ENDCHAR
+STARTCHAR afii10090
+ENCODING 1096
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10091
+ENCODING 1097
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10092
+ENCODING 1098
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10093
+ENCODING 1099
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10094
+ENCODING 1100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10095
+ENCODING 1101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10096
+ENCODING 1102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10097
+ENCODING 1103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+60
+A0
+00
+ENDCHAR
+STARTCHAR afii10071
+ENCODING 1105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10099
+ENCODING 1106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+20
+ENDCHAR
+STARTCHAR afii10100
+ENCODING 1107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10101
+ENCODING 1108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10102
+ENCODING 1109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10103
+ENCODING 1110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10104
+ENCODING 1111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10105
+ENCODING 1112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR afii10106
+ENCODING 1113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10107
+ENCODING 1114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10108
+ENCODING 1115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10109
+ENCODING 1116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10110
+ENCODING 1118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10193
+ENCODING 1119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10050
+ENCODING 1168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10098
+ENCODING 1169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR uni0492
+ENCODING 1170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni0493
+ENCODING 1171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii57664
+ENCODING 1488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii57665
+ENCODING 1489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+F0
+00
+ENDCHAR
+STARTCHAR afii57666
+ENCODING 1490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii57667
+ENCODING 1491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57668
+ENCODING 1492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57669
+ENCODING 1493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57670
+ENCODING 1494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii57671
+ENCODING 1495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57672
+ENCODING 1496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii57673
+ENCODING 1497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR afii57674
+ENCODING 1498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57675
+ENCODING 1499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii57676
+ENCODING 1500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR afii57677
+ENCODING 1501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57678
+ENCODING 1502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57679
+ENCODING 1503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57680
+ENCODING 1504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR afii57681
+ENCODING 1505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii57682
+ENCODING 1506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+60
+C0
+00
+ENDCHAR
+STARTCHAR afii57683
+ENCODING 1507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57684
+ENCODING 1508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57685
+ENCODING 1509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57686
+ENCODING 1510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57687
+ENCODING 1511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57688
+ENCODING 1512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57689
+ENCODING 1513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+D0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57690
+ENCODING 1514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+20
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+60
+20
+40
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2016
+ENCODING 8214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR underscoredbl
+ENCODING 8215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+F0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+20
+40
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+50
+50
+A0
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+50
+00
+00
+00
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2023
+ENCODING 8227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+E0
+C0
+00
+00
+ENDCHAR
+STARTCHAR onedotenleader
+ENCODING 8228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR twodotenleader
+ENCODING 8229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+A0
+00
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+B0
+00
+ENDCHAR
+STARTCHAR uni2027
+ENCODING 8231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+80
+30
+00
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+80
+40
+00
+00
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+20
+40
+00
+00
+ENDCHAR
+STARTCHAR uni203E
+ENCODING 8254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR nsuperior
+ENCODING 8319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR peseta
+ENCODING 8359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR afii61352
+ENCODING 8470
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+B0
+B0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+00
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 8486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni2127
+ENCODING 8487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR oneeighth
+ENCODING 8539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+20
+50
+20
+ENDCHAR
+STARTCHAR threeeighths
+ENCODING 8540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+60
+D0
+20
+ENDCHAR
+STARTCHAR fiveeighths
+ENCODING 8541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+70
+A0
+50
+20
+ENDCHAR
+STARTCHAR seveneighths
+ENCODING 8542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+A0
+50
+20
+ENDCHAR
+STARTCHAR arrowleft
+ENCODING 8592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+F0
+40
+00
+00
+ENDCHAR
+STARTCHAR arrowup
+ENCODING 8593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR arrowright
+ENCODING 8594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+F0
+20
+00
+00
+ENDCHAR
+STARTCHAR arrowdown
+ENCODING 8595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR arrowboth
+ENCODING 8596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+F0
+50
+00
+00
+ENDCHAR
+STARTCHAR arrowupdn
+ENCODING 8597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni2201
+ENCODING 8705
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR partialdiff
+ENCODING 8706
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+E0
+60
+E0
+80
+ENDCHAR
+STARTCHAR emptyset
+ENCODING 8709
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR Delta
+ENCODING 8710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR gradient
+ENCODING 8711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR element
+ENCODING 8712
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+80
+60
+00
+ENDCHAR
+STARTCHAR notelement
+ENCODING 8713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+E0
+A0
+60
+40
+ENDCHAR
+STARTCHAR uni220A
+ENCODING 8714
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+C0
+80
+40
+00
+ENDCHAR
+STARTCHAR suchthat
+ENCODING 8715
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+E0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni220C
+ENCODING 8716
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR uni220D
+ENCODING 8717
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+C0
+40
+80
+00
+ENDCHAR
+STARTCHAR uni220E
+ENCODING 8718
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+00
+ENDCHAR
+STARTCHAR product
+ENCODING 8719
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2210
+ENCODING 8720
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR summation
+ENCODING 8721
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2213
+ENCODING 8723
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni2214
+ENCODING 8724
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR uni2216
+ENCODING 8726
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR asteriskmath
+ENCODING 8727
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+70
+E0
+50
+40
+ENDCHAR
+STARTCHAR uni2218
+ENCODING 8728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+00
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR radical
+ENCODING 8730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+20
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni221B
+ENCODING 8731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+50
+D0
+10
+50
+30
+ENDCHAR
+STARTCHAR uni221C
+ENCODING 8732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+D0
+50
+10
+50
+30
+ENDCHAR
+STARTCHAR proportional
+ENCODING 8733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+E0
+50
+00
+ENDCHAR
+STARTCHAR infinity
+ENCODING 8734
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+D0
+B0
+40
+00
+ENDCHAR
+STARTCHAR orthogonal
+ENCODING 8735
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR angle
+ENCODING 8736
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR uni2221
+ENCODING 8737
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+A0
+40
+A0
+F0
+20
+ENDCHAR
+STARTCHAR uni2222
+ENCODING 8738
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+A0
+A0
+60
+90
+ENDCHAR
+STARTCHAR uni2223
+ENCODING 8739
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni2224
+ENCODING 8740
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+40
+00
+ENDCHAR
+STARTCHAR uni2225
+ENCODING 8741
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2226
+ENCODING 8742
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+B0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicaland
+ENCODING 8743
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicalor
+ENCODING 8744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR intersection
+ENCODING 8745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR union
+ENCODING 8746
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR integral
+ENCODING 8747
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR uni222C
+ENCODING 8748
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+A0
+A0
+80
+ENDCHAR
+STARTCHAR uni222D
+ENCODING 8749
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+D0
+D0
+D0
+A0
+ENDCHAR
+STARTCHAR uni222E
+ENCODING 8750
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+E0
+40
+80
+ENDCHAR
+STARTCHAR uni222F
+ENCODING 8751
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+80
+ENDCHAR
+STARTCHAR uni2230
+ENCODING 8752
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+F0
+F0
+D0
+A0
+ENDCHAR
+STARTCHAR uni2231
+ENCODING 8753
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+50
+40
+80
+ENDCHAR
+STARTCHAR uni2232
+ENCODING 8754
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+C0
+40
+80
+ENDCHAR
+STARTCHAR uni2233
+ENCODING 8755
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+E0
+40
+80
+ENDCHAR
+STARTCHAR therefore
+ENCODING 8756
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2235
+ENCODING 8757
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2237
+ENCODING 8759
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2238
+ENCODING 8760
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2239
+ENCODING 8761
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+20
+C0
+20
+00
+ENDCHAR
+STARTCHAR uni223A
+ENCODING 8762
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni223B
+ENCODING 8763
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+50
+A0
+00
+40
+ENDCHAR
+STARTCHAR similar
+ENCODING 8764
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni223D
+ENCODING 8765
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni223E
+ENCODING 8766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+D0
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni223F
+ENCODING 8767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+50
+A0
+20
+00
+ENDCHAR
+STARTCHAR uni2240
+ENCODING 8768
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR uni2241
+ENCODING 8769
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+B0
+D0
+40
+80
+ENDCHAR
+STARTCHAR uni2242
+ENCODING 8770
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+00
+A0
+50
+00
+ENDCHAR
+STARTCHAR uni2243
+ENCODING 8771
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2244
+ENCODING 8772
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+D0
+B0
+40
+F0
+40
+ENDCHAR
+STARTCHAR congruent
+ENCODING 8773
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni2246
+ENCODING 8774
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR uni2247
+ENCODING 8775
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR approxequal
+ENCODING 8776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni2249
+ENCODING 8777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+40
+50
+E0
+80
+ENDCHAR
+STARTCHAR uni224A
+ENCODING 8778
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+00
+F0
+ENDCHAR
+STARTCHAR uni224B
+ENCODING 8779
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+40
+B0
+ENDCHAR
+STARTCHAR uni224C
+ENCODING 8780
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+50
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni224D
+ENCODING 8781
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni224E
+ENCODING 8782
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni224F
+ENCODING 8783
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2250
+ENCODING 8784
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2251
+ENCODING 8785
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+40
+ENDCHAR
+STARTCHAR uni2252
+ENCODING 8786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+00
+E0
+00
+20
+ENDCHAR
+STARTCHAR uni2253
+ENCODING 8787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+00
+E0
+00
+80
+ENDCHAR
+STARTCHAR uni2254
+ENCODING 8788
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+00
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni2255
+ENCODING 8789
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+D0
+00
+D0
+00
+00
+ENDCHAR
+STARTCHAR uni2256
+ENCODING 8790
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2257
+ENCODING 8791
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2258
+ENCODING 8792
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225B
+ENCODING 8795
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225C
+ENCODING 8796
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225D
+ENCODING 8797
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225E
+ENCODING 8798
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225F
+ENCODING 8799
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2263
+ENCODING 8803
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2266
+ENCODING 8806
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2267
+ENCODING 8807
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2268
+ENCODING 8808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2269
+ENCODING 8809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni226A
+ENCODING 8810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni226B
+ENCODING 8811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni226C
+ENCODING 8812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni226D
+ENCODING 8813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+60
+80
+00
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+60
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2272
+ENCODING 8818
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+50
+A0
+ENDCHAR
+STARTCHAR uni2273
+ENCODING 8819
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2276
+ENCODING 8822
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+20
+80
+60
+C0
+ENDCHAR
+STARTCHAR uni2277
+ENCODING 8823
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+80
+20
+C0
+60
+ENDCHAR
+STARTCHAR uni2278
+ENCODING 8824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+60
+C0
+60
+C0
+ENDCHAR
+STARTCHAR uni2279
+ENCODING 8825
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+60
+C0
+60
+ENDCHAR
+STARTCHAR uni227A
+ENCODING 8826
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+C0
+20
+00
+00
+ENDCHAR
+STARTCHAR uni227B
+ENCODING 8827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+60
+80
+00
+00
+ENDCHAR
+STARTCHAR uni227C
+ENCODING 8828
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227D
+ENCODING 8829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+80
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227E
+ENCODING 8830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni227F
+ENCODING 8831
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2280
+ENCODING 8832
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2281
+ENCODING 8833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR propersubset
+ENCODING 8834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+60
+00
+00
+ENDCHAR
+STARTCHAR propersuperset
+ENCODING 8835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+C0
+00
+00
+ENDCHAR
+STARTCHAR notsubset
+ENCODING 8836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2285
+ENCODING 8837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR reflexsubset
+ENCODING 8838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR reflexsuperset
+ENCODING 8839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2288
+ENCODING 8840
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2289
+ENCODING 8841
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+40
+ENDCHAR
+STARTCHAR uni228A
+ENCODING 8842
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni228B
+ENCODING 8843
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+40
+E0
+80
+ENDCHAR
+STARTCHAR revlogicalnot
+ENCODING 8976
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+80
+00
+00
+ENDCHAR
+STARTCHAR integraltp
+ENCODING 8992
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR integralbt
+ENCODING 8993
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+20
+20
+40
+ENDCHAR
+STARTCHAR uni23BA
+ENCODING 9146
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BB
+ENCODING 9147
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BC
+ENCODING 9148
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni23BD
+ENCODING 9149
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2409
+ENCODING 9225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240A
+ENCODING 9226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+60
+40
+40
+ENDCHAR
+STARTCHAR uni240B
+ENCODING 9227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240C
+ENCODING 9228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+80
+60
+60
+40
+ENDCHAR
+STARTCHAR uni240D
+ENCODING 9229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+E0
+50
+60
+50
+ENDCHAR
+STARTCHAR uni2423
+ENCODING 9251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+90
+F0
+ENDCHAR
+STARTCHAR uni2424
+ENCODING 9252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+B0
+90
+20
+20
+30
+ENDCHAR
+STARTCHAR SF100000
+ENCODING 9472
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2501
+ENCODING 9473
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+00
+00
+ENDCHAR
+STARTCHAR SF110000
+ENCODING 9474
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2503
+ENCODING 9475
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR uni2504
+ENCODING 9476
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2505
+ENCODING 9477
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni2506
+ENCODING 9478
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2507
+ENCODING 9479
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR uni2508
+ENCODING 9480
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2509
+ENCODING 9481
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni250A
+ENCODING 9482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni250B
+ENCODING 9483
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR SF010000
+ENCODING 9484
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250D
+ENCODING 9485
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250E
+ENCODING 9486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR uni250F
+ENCODING 9487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF030000
+ENCODING 9488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2511
+ENCODING 9489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2512
+ENCODING 9490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2513
+ENCODING 9491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF020000
+ENCODING 9492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2515
+ENCODING 9493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2516
+ENCODING 9494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2517
+ENCODING 9495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR SF040000
+ENCODING 9496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2519
+ENCODING 9497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni251A
+ENCODING 9498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni251B
+ENCODING 9499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF080000
+ENCODING 9500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251D
+ENCODING 9501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251E
+ENCODING 9502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251F
+ENCODING 9503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2520
+ENCODING 9504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2521
+ENCODING 9505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni2522
+ENCODING 9506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2523
+ENCODING 9507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF090000
+ENCODING 9508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2525
+ENCODING 9509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2526
+ENCODING 9510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni2527
+ENCODING 9511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2528
+ENCODING 9512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2529
+ENCODING 9513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni252A
+ENCODING 9514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni252B
+ENCODING 9515
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF060000
+ENCODING 9516
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252D
+ENCODING 9517
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252E
+ENCODING 9518
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252F
+ENCODING 9519
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2530
+ENCODING 9520
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2531
+ENCODING 9521
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2532
+ENCODING 9522
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2533
+ENCODING 9523
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF070000
+ENCODING 9524
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2535
+ENCODING 9525
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2536
+ENCODING 9526
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2537
+ENCODING 9527
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2538
+ENCODING 9528
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2539
+ENCODING 9529
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253A
+ENCODING 9530
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253B
+ENCODING 9531
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF050000
+ENCODING 9532
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253D
+ENCODING 9533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253E
+ENCODING 9534
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253F
+ENCODING 9535
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2540
+ENCODING 9536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2541
+ENCODING 9537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2542
+ENCODING 9538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2543
+ENCODING 9539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2544
+ENCODING 9540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2545
+ENCODING 9541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2546
+ENCODING 9542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2547
+ENCODING 9543
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2548
+ENCODING 9544
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2549
+ENCODING 9545
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254A
+ENCODING 9546
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254B
+ENCODING 9547
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254C
+ENCODING 9548
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254D
+ENCODING 9549
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254E
+ENCODING 9550
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+00
+40
+40
+ENDCHAR
+STARTCHAR uni254F
+ENCODING 9551
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR SF430000
+ENCODING 9552
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF240000
+ENCODING 9553
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR SF510000
+ENCODING 9554
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF520000
+ENCODING 9555
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR SF390000
+ENCODING 9556
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF220000
+ENCODING 9557
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF210000
+ENCODING 9558
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF250000
+ENCODING 9559
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF500000
+ENCODING 9560
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF490000
+ENCODING 9561
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR SF380000
+ENCODING 9562
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF280000
+ENCODING 9563
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+00
+ENDCHAR
+STARTCHAR SF270000
+ENCODING 9564
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF260000
+ENCODING 9565
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR SF360000
+ENCODING 9566
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF370000
+ENCODING 9567
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR SF420000
+ENCODING 9568
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF190000
+ENCODING 9569
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF200000
+ENCODING 9570
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF230000
+ENCODING 9571
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF470000
+ENCODING 9572
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+40
+ENDCHAR
+STARTCHAR SF480000
+ENCODING 9573
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF410000
+ENCODING 9574
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR SF450000
+ENCODING 9575
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF460000
+ENCODING 9576
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF400000
+ENCODING 9577
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF540000
+ENCODING 9578
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+40
+F0
+40
+ENDCHAR
+STARTCHAR SF530000
+ENCODING 9579
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF440000
+ENCODING 9580
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR uni256D
+ENCODING 9581
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+30
+40
+40
+ENDCHAR
+STARTCHAR uni256E
+ENCODING 9582
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+80
+40
+40
+ENDCHAR
+STARTCHAR uni256F
+ENCODING 9583
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+80
+00
+00
+ENDCHAR
+STARTCHAR uni2570
+ENCODING 9584
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+30
+00
+00
+ENDCHAR
+STARTCHAR uni2571
+ENCODING 9585
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+20
+40
+40
+80
+ENDCHAR
+STARTCHAR uni2572
+ENCODING 9586
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+20
+20
+10
+ENDCHAR
+STARTCHAR uni2573
+ENCODING 9587
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+60
+90
+90
+ENDCHAR
+STARTCHAR uni2574
+ENCODING 9588
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2575
+ENCODING 9589
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2576
+ENCODING 9590
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2577
+ENCODING 9591
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2578
+ENCODING 9592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2579
+ENCODING 9593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+00
+00
+ENDCHAR
+STARTCHAR uni257A
+ENCODING 9594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni257B
+ENCODING 9595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257C
+ENCODING 9596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+30
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257D
+ENCODING 9597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257E
+ENCODING 9598
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257F
+ENCODING 9599
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+40
+40
+ENDCHAR
+STARTCHAR upblock
+ENCODING 9600
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2581
+ENCODING 9601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2582
+ENCODING 9602
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F8
+ENDCHAR
+STARTCHAR uni2583
+ENCODING 9603
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F8
+F8
+ENDCHAR
+STARTCHAR dnblock
+ENCODING 9604
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2585
+ENCODING 9605
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2586
+ENCODING 9606
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2587
+ENCODING 9607
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR block
+ENCODING 9608
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2589
+ENCODING 9609
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni258A
+ENCODING 9610
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni258B
+ENCODING 9611
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR lfblock
+ENCODING 9612
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258D
+ENCODING 9613
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258E
+ENCODING 9614
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR uni258F
+ENCODING 9615
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR rtblock
+ENCODING 9616
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ltshade
+ENCODING 9617
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+80
+20
+80
+20
+ENDCHAR
+STARTCHAR shade
+ENCODING 9618
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A8
+50
+A8
+50
+A8
+50
+ENDCHAR
+STARTCHAR dkshade
+ENCODING 9619
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B8
+E8
+B8
+E8
+B8
+E8
+ENDCHAR
+STARTCHAR uni2594
+ENCODING 9620
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2595
+ENCODING 9621
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR filledbox
+ENCODING 9632
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR H22073
+ENCODING 9633
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uni25C6
+ENCODING 9670
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR spade
+ENCODING 9824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR club
+ENCODING 9827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+E0
+00
+ENDCHAR
+STARTCHAR heart
+ENCODING 9829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR diamond
+ENCODING 9830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2669
+ENCODING 9833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnote
+ENCODING 9834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnotedbl
+ENCODING 9835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+50
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266C
+ENCODING 9836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+70
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266D
+ENCODING 9837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni266E
+ENCODING 9838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+A0
+E0
+20
+00
+ENDCHAR
+STARTCHAR uni266F
+ENCODING 9839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uniFFFD
+ENCODING 65533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+90
+D0
+F0
+D0
+F0
+ENDCHAR
+ENDFONT
diff --git a/src/col64/cruft/col64font_ext.bdf b/src/col64/cruft/col64font_ext.bdf
new file mode 100644
index 0000000..c6cc5f0
--- /dev/null
+++ b/src/col64/cruft/col64font_ext.bdf
@@ -0,0 +1,11994 @@
+STARTFONT 2.1
+COMMENT Contributed by Janne V. Kujala <jvk@iki.fi>
+COMMENT $Id: 4x6.bdf,v 1.5 2002-08-26 18:05:49+01 mgk25 Rel $
+COMMENT Send bug reports to Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+FONT -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1
+SIZE 6 75 75
+FONTBOUNDINGBOX 4 6 0 -1
+STARTPROPERTIES 23
+FONTNAME_REGISTRY ""
+FOUNDRY "Misc"
+FAMILY_NAME "Fixed"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 6
+POINT_SIZE 60
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 40
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 5
+FONT_DESCENT 1
+DESTINATION 1
+COPYRIGHT "Public domain font. Share and enjoy."
+CAP_HEIGHT 5
+X_HEIGHT 4
+DEFAULT_CHAR 0
+_GBDFED_INFO "Edited with gbdfed 1.4."
+ENDPROPERTIES
+CHARS 920
+STARTCHAR char0
+ENCODING 0
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+A0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+60
+50
+E0
+00
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+20
+40
+90
+00
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+A0
+D0
+00
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+A0
+00
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+B0
+D0
+60
+00
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+10
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+F0
+20
+00
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+10
+E0
+00
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+E0
+90
+60
+00
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+10
+20
+40
+40
+00
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+60
+90
+60
+00
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+70
+10
+E0
+00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+80
+40
+20
+00
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+20
+40
+80
+00
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+20
+00
+20
+00
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+B0
+B0
+80
+60
+00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+80
+90
+60
+00
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+90
+90
+E0
+00
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+F0
+00
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+B0
+90
+60
+00
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+10
+10
+90
+60
+00
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+F0
+00
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+D0
+90
+90
+00
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+D0
+B0
+90
+90
+00
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+A0
+50
+00
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+A0
+90
+00
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+90
+90
+00
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+20
+40
+00
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+40
+80
+F0
+00
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+40
+40
+60
+00
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F0
+00
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+B0
+50
+00
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+80
+80
+70
+00
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+70
+90
+70
+00
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+E0
+70
+00
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+70
+10
+00
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+90
+00
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+60
+20
+20
+00
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+F0
+D0
+90
+00
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+90
+90
+00
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+E0
+80
+00
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+70
+10
+00
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+80
+80
+00
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+C0
+30
+E0
+00
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+60
+20
+00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+80
+40
+60
+00
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+20
+40
+C0
+00
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+80
+10
+C0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+E0
+40
+00
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+40
+A0
+00
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+00
+40
+40
+00
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+D0
+D0
+90
+60
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+00
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+D0
+60
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+C0
+00
+00
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+40
+80
+00
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+D0
+D0
+50
+50
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+50
+70
+10
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+10
+20
+30
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+50
+B0
+10
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+F0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+80
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+50
+D0
+50
+E0
+00
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+E0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+A0
+00
+00
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+E0
+80
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+80
+60
+40
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+40
+00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+A0
+60
+20
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+20
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+40
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+20
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+A0
+A0
+20
+60
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+20
+20
+C0
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+E0
+20
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+C0
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+A0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+50
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+20
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+40
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+00
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+A0
+20
+40
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+00
+40
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+C0
+80
+80
+20
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+E0
+00
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+20
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+60
+40
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+40
+80
+00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR longs
+ENCODING 383
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni018F
+ENCODING 399
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+40
+80
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+00
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+80
+C0
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0374
+ENCODING 884
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0375
+ENCODING 885
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR uni037A
+ENCODING 890
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+60
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR Alphatonos
+ENCODING 902
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR Epsilontonos
+ENCODING 904
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+60
+40
+60
+00
+ENDCHAR
+STARTCHAR Etatonos
+ENCODING 905
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Iotatonos
+ENCODING 906
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Omicrontonos
+ENCODING 908
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Upsilontonos
+ENCODING 910
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omegatonos
+ENCODING 911
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR iotadieresistonos
+ENCODING 912
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+40
+20
+00
+ENDCHAR
+STARTCHAR Alpha
+ENCODING 913
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Beta
+ENCODING 914
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Gamma
+ENCODING 915
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR Delta
+ENCODING 916
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Epsilon
+ENCODING 917
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zeta
+ENCODING 918
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eta
+ENCODING 919
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Theta
+ENCODING 920
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Iota
+ENCODING 921
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Kappa
+ENCODING 922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Lambda
+ENCODING 923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Mu
+ENCODING 924
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Nu
+ENCODING 925
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR Xi
+ENCODING 926
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR Omicron
+ENCODING 927
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Pi
+ENCODING 928
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Rho
+ENCODING 929
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR Sigma
+ENCODING 931
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Tau
+ENCODING 932
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Upsilon
+ENCODING 933
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Phi
+ENCODING 934
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR Chi
+ENCODING 935
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Psi
+ENCODING 936
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 937
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR Iotadieresis
+ENCODING 938
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Upsilondieresis
+ENCODING 939
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR alphatonos
+ENCODING 940
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR epsilontonos
+ENCODING 941
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR etatonos
+ENCODING 942
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR iotatonos
+ENCODING 943
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresistonos
+ENCODING 944
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR alpha
+ENCODING 945
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+A0
+50
+00
+ENDCHAR
+STARTCHAR beta
+ENCODING 946
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR gamma
+ENCODING 947
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR delta
+ENCODING 948
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR epsilon
+ENCODING 949
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR zeta
+ENCODING 950
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+80
+E0
+20
+40
+ENDCHAR
+STARTCHAR eta
+ENCODING 951
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR theta
+ENCODING 952
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR iota
+ENCODING 953
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR kappa
+ENCODING 954
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR lambda
+ENCODING 955
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR nu
+ENCODING 957
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+40
+00
+ENDCHAR
+STARTCHAR xi
+ENCODING 958
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR omicron
+ENCODING 959
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR pi
+ENCODING 960
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR rho
+ENCODING 961
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR sigma1
+ENCODING 962
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+40
+C0
+00
+ENDCHAR
+STARTCHAR sigma
+ENCODING 963
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+A0
+40
+00
+ENDCHAR
+STARTCHAR tau
+ENCODING 964
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilon
+ENCODING 965
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR phi
+ENCODING 966
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+A0
+40
+40
+ENDCHAR
+STARTCHAR chi
+ENCODING 967
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+60
+A0
+00
+ENDCHAR
+STARTCHAR psi
+ENCODING 968
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR omega
+ENCODING 969
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR iotadieresis
+ENCODING 970
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresis
+ENCODING 971
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omicrontonos
+ENCODING 972
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR upsilontonos
+ENCODING 973
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omegatonos
+ENCODING 974
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10023
+ENCODING 1025
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10051
+ENCODING 1026
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10052
+ENCODING 1027
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10053
+ENCODING 1028
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10054
+ENCODING 1029
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10055
+ENCODING 1030
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10056
+ENCODING 1031
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10057
+ENCODING 1032
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10058
+ENCODING 1033
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10059
+ENCODING 1034
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10060
+ENCODING 1035
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10061
+ENCODING 1036
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10062
+ENCODING 1038
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10145
+ENCODING 1039
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10017
+ENCODING 1040
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10018
+ENCODING 1041
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10019
+ENCODING 1042
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10020
+ENCODING 1043
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10021
+ENCODING 1044
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10022
+ENCODING 1045
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10024
+ENCODING 1046
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10025
+ENCODING 1047
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10026
+ENCODING 1048
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+E0
+A0
+20
+00
+ENDCHAR
+STARTCHAR afii10027
+ENCODING 1049
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR afii10028
+ENCODING 1050
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10029
+ENCODING 1051
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10030
+ENCODING 1052
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10031
+ENCODING 1053
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10032
+ENCODING 1054
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10033
+ENCODING 1055
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10034
+ENCODING 1056
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10035
+ENCODING 1057
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10036
+ENCODING 1058
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10037
+ENCODING 1059
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+40
+40
+80
+ENDCHAR
+STARTCHAR afii10038
+ENCODING 1060
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii10039
+ENCODING 1061
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10040
+ENCODING 1062
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii10041
+ENCODING 1063
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+60
+20
+20
+00
+ENDCHAR
+STARTCHAR afii10042
+ENCODING 1064
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10043
+ENCODING 1065
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10044
+ENCODING 1066
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10045
+ENCODING 1067
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10046
+ENCODING 1068
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10047
+ENCODING 1069
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10048
+ENCODING 1070
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+D0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10049
+ENCODING 1071
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10065
+ENCODING 1072
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR afii10066
+ENCODING 1073
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10067
+ENCODING 1074
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10068
+ENCODING 1075
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10069
+ENCODING 1076
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10070
+ENCODING 1077
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10072
+ENCODING 1078
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+60
+60
+B0
+00
+ENDCHAR
+STARTCHAR afii10073
+ENCODING 1079
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10074
+ENCODING 1080
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10075
+ENCODING 1081
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10076
+ENCODING 1082
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10077
+ENCODING 1083
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10078
+ENCODING 1084
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10079
+ENCODING 1085
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10080
+ENCODING 1086
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10081
+ENCODING 1087
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10082
+ENCODING 1088
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii10083
+ENCODING 1089
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10084
+ENCODING 1090
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10085
+ENCODING 1091
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR afii10086
+ENCODING 1092
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR afii10087
+ENCODING 1093
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii10088
+ENCODING 1094
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+20
+ENDCHAR
+STARTCHAR afii10089
+ENCODING 1095
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+00
+ENDCHAR
+STARTCHAR afii10090
+ENCODING 1096
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10091
+ENCODING 1097
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10092
+ENCODING 1098
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10093
+ENCODING 1099
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10094
+ENCODING 1100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10095
+ENCODING 1101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10096
+ENCODING 1102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10097
+ENCODING 1103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+60
+A0
+00
+ENDCHAR
+STARTCHAR afii10071
+ENCODING 1105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10099
+ENCODING 1106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+20
+ENDCHAR
+STARTCHAR afii10100
+ENCODING 1107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10101
+ENCODING 1108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10102
+ENCODING 1109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10103
+ENCODING 1110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10104
+ENCODING 1111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10105
+ENCODING 1112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR afii10106
+ENCODING 1113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10107
+ENCODING 1114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10108
+ENCODING 1115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10109
+ENCODING 1116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10110
+ENCODING 1118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10193
+ENCODING 1119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10050
+ENCODING 1168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10098
+ENCODING 1169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR uni0492
+ENCODING 1170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni0493
+ENCODING 1171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii57664
+ENCODING 1488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii57665
+ENCODING 1489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+F0
+00
+ENDCHAR
+STARTCHAR afii57666
+ENCODING 1490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii57667
+ENCODING 1491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57668
+ENCODING 1492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57669
+ENCODING 1493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57670
+ENCODING 1494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii57671
+ENCODING 1495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57672
+ENCODING 1496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii57673
+ENCODING 1497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR afii57674
+ENCODING 1498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57675
+ENCODING 1499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii57676
+ENCODING 1500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR afii57677
+ENCODING 1501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57678
+ENCODING 1502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57679
+ENCODING 1503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57680
+ENCODING 1504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR afii57681
+ENCODING 1505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii57682
+ENCODING 1506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+60
+C0
+00
+ENDCHAR
+STARTCHAR afii57683
+ENCODING 1507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57684
+ENCODING 1508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57685
+ENCODING 1509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57686
+ENCODING 1510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57687
+ENCODING 1511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57688
+ENCODING 1512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57689
+ENCODING 1513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+D0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57690
+ENCODING 1514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+20
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+60
+20
+40
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2016
+ENCODING 8214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR underscoredbl
+ENCODING 8215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+F0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+20
+40
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+50
+50
+A0
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+50
+00
+00
+00
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2023
+ENCODING 8227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+E0
+C0
+00
+00
+ENDCHAR
+STARTCHAR onedotenleader
+ENCODING 8228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR twodotenleader
+ENCODING 8229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+A0
+00
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+B0
+00
+ENDCHAR
+STARTCHAR uni2027
+ENCODING 8231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+80
+30
+00
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+80
+40
+00
+00
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+20
+40
+00
+00
+ENDCHAR
+STARTCHAR uni203E
+ENCODING 8254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR nsuperior
+ENCODING 8319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR peseta
+ENCODING 8359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR afii61352
+ENCODING 8470
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+B0
+B0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+00
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 8486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni2127
+ENCODING 8487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR oneeighth
+ENCODING 8539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+20
+50
+20
+ENDCHAR
+STARTCHAR threeeighths
+ENCODING 8540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+60
+D0
+20
+ENDCHAR
+STARTCHAR fiveeighths
+ENCODING 8541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+70
+A0
+50
+20
+ENDCHAR
+STARTCHAR seveneighths
+ENCODING 8542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+A0
+50
+20
+ENDCHAR
+STARTCHAR arrowleft
+ENCODING 8592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+F0
+40
+00
+00
+ENDCHAR
+STARTCHAR arrowup
+ENCODING 8593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR arrowright
+ENCODING 8594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+F0
+20
+00
+00
+ENDCHAR
+STARTCHAR arrowdown
+ENCODING 8595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR arrowboth
+ENCODING 8596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+F0
+50
+00
+00
+ENDCHAR
+STARTCHAR arrowupdn
+ENCODING 8597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni2201
+ENCODING 8705
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR partialdiff
+ENCODING 8706
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+E0
+60
+E0
+80
+ENDCHAR
+STARTCHAR emptyset
+ENCODING 8709
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR Delta
+ENCODING 8710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR gradient
+ENCODING 8711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR element
+ENCODING 8712
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+80
+60
+00
+ENDCHAR
+STARTCHAR notelement
+ENCODING 8713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+E0
+A0
+60
+40
+ENDCHAR
+STARTCHAR uni220A
+ENCODING 8714
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+C0
+80
+40
+00
+ENDCHAR
+STARTCHAR suchthat
+ENCODING 8715
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+E0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni220C
+ENCODING 8716
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR uni220D
+ENCODING 8717
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+C0
+40
+80
+00
+ENDCHAR
+STARTCHAR uni220E
+ENCODING 8718
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+00
+ENDCHAR
+STARTCHAR product
+ENCODING 8719
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2210
+ENCODING 8720
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR summation
+ENCODING 8721
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2213
+ENCODING 8723
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni2214
+ENCODING 8724
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR uni2216
+ENCODING 8726
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR asteriskmath
+ENCODING 8727
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+70
+E0
+50
+40
+ENDCHAR
+STARTCHAR uni2218
+ENCODING 8728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+00
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR radical
+ENCODING 8730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+20
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni221B
+ENCODING 8731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+50
+D0
+10
+50
+30
+ENDCHAR
+STARTCHAR uni221C
+ENCODING 8732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+D0
+50
+10
+50
+30
+ENDCHAR
+STARTCHAR proportional
+ENCODING 8733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+E0
+50
+00
+ENDCHAR
+STARTCHAR infinity
+ENCODING 8734
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+D0
+B0
+40
+00
+ENDCHAR
+STARTCHAR orthogonal
+ENCODING 8735
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR angle
+ENCODING 8736
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR uni2221
+ENCODING 8737
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+A0
+40
+A0
+F0
+20
+ENDCHAR
+STARTCHAR uni2222
+ENCODING 8738
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+A0
+A0
+60
+90
+ENDCHAR
+STARTCHAR uni2223
+ENCODING 8739
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni2224
+ENCODING 8740
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+40
+00
+ENDCHAR
+STARTCHAR uni2225
+ENCODING 8741
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2226
+ENCODING 8742
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+B0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicaland
+ENCODING 8743
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicalor
+ENCODING 8744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR intersection
+ENCODING 8745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR union
+ENCODING 8746
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR integral
+ENCODING 8747
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR uni222C
+ENCODING 8748
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+A0
+A0
+80
+ENDCHAR
+STARTCHAR uni222D
+ENCODING 8749
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+D0
+D0
+D0
+A0
+ENDCHAR
+STARTCHAR uni222E
+ENCODING 8750
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+E0
+40
+80
+ENDCHAR
+STARTCHAR uni222F
+ENCODING 8751
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+80
+ENDCHAR
+STARTCHAR uni2230
+ENCODING 8752
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+F0
+F0
+D0
+A0
+ENDCHAR
+STARTCHAR uni2231
+ENCODING 8753
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+50
+40
+80
+ENDCHAR
+STARTCHAR uni2232
+ENCODING 8754
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+C0
+40
+80
+ENDCHAR
+STARTCHAR uni2233
+ENCODING 8755
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+E0
+40
+80
+ENDCHAR
+STARTCHAR therefore
+ENCODING 8756
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2235
+ENCODING 8757
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2237
+ENCODING 8759
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2238
+ENCODING 8760
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2239
+ENCODING 8761
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+20
+C0
+20
+00
+ENDCHAR
+STARTCHAR uni223A
+ENCODING 8762
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni223B
+ENCODING 8763
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+50
+A0
+00
+40
+ENDCHAR
+STARTCHAR similar
+ENCODING 8764
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni223D
+ENCODING 8765
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni223E
+ENCODING 8766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+D0
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni223F
+ENCODING 8767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+50
+A0
+20
+00
+ENDCHAR
+STARTCHAR uni2240
+ENCODING 8768
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR uni2241
+ENCODING 8769
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+B0
+D0
+40
+80
+ENDCHAR
+STARTCHAR uni2242
+ENCODING 8770
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+00
+A0
+50
+00
+ENDCHAR
+STARTCHAR uni2243
+ENCODING 8771
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2244
+ENCODING 8772
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+D0
+B0
+40
+F0
+40
+ENDCHAR
+STARTCHAR congruent
+ENCODING 8773
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni2246
+ENCODING 8774
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR uni2247
+ENCODING 8775
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR approxequal
+ENCODING 8776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni2249
+ENCODING 8777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+40
+50
+E0
+80
+ENDCHAR
+STARTCHAR uni224A
+ENCODING 8778
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+00
+F0
+ENDCHAR
+STARTCHAR uni224B
+ENCODING 8779
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+40
+B0
+ENDCHAR
+STARTCHAR uni224C
+ENCODING 8780
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+50
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni224D
+ENCODING 8781
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni224E
+ENCODING 8782
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni224F
+ENCODING 8783
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2250
+ENCODING 8784
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2251
+ENCODING 8785
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+40
+ENDCHAR
+STARTCHAR uni2252
+ENCODING 8786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+00
+E0
+00
+20
+ENDCHAR
+STARTCHAR uni2253
+ENCODING 8787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+00
+E0
+00
+80
+ENDCHAR
+STARTCHAR uni2254
+ENCODING 8788
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+00
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni2255
+ENCODING 8789
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+D0
+00
+D0
+00
+00
+ENDCHAR
+STARTCHAR uni2256
+ENCODING 8790
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2257
+ENCODING 8791
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2258
+ENCODING 8792
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225B
+ENCODING 8795
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225C
+ENCODING 8796
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225D
+ENCODING 8797
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225E
+ENCODING 8798
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225F
+ENCODING 8799
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2263
+ENCODING 8803
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2266
+ENCODING 8806
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2267
+ENCODING 8807
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2268
+ENCODING 8808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2269
+ENCODING 8809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni226A
+ENCODING 8810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni226B
+ENCODING 8811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni226C
+ENCODING 8812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni226D
+ENCODING 8813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+60
+80
+00
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+60
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2272
+ENCODING 8818
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+50
+A0
+ENDCHAR
+STARTCHAR uni2273
+ENCODING 8819
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2276
+ENCODING 8822
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+20
+80
+60
+C0
+ENDCHAR
+STARTCHAR uni2277
+ENCODING 8823
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+80
+20
+C0
+60
+ENDCHAR
+STARTCHAR uni2278
+ENCODING 8824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+60
+C0
+60
+C0
+ENDCHAR
+STARTCHAR uni2279
+ENCODING 8825
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+60
+C0
+60
+ENDCHAR
+STARTCHAR uni227A
+ENCODING 8826
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+C0
+20
+00
+00
+ENDCHAR
+STARTCHAR uni227B
+ENCODING 8827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+60
+80
+00
+00
+ENDCHAR
+STARTCHAR uni227C
+ENCODING 8828
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227D
+ENCODING 8829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+80
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227E
+ENCODING 8830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni227F
+ENCODING 8831
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2280
+ENCODING 8832
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2281
+ENCODING 8833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR propersubset
+ENCODING 8834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+60
+00
+00
+ENDCHAR
+STARTCHAR propersuperset
+ENCODING 8835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+C0
+00
+00
+ENDCHAR
+STARTCHAR notsubset
+ENCODING 8836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2285
+ENCODING 8837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR reflexsubset
+ENCODING 8838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR reflexsuperset
+ENCODING 8839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2288
+ENCODING 8840
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2289
+ENCODING 8841
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+40
+ENDCHAR
+STARTCHAR uni228A
+ENCODING 8842
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni228B
+ENCODING 8843
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+40
+E0
+80
+ENDCHAR
+STARTCHAR revlogicalnot
+ENCODING 8976
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+80
+00
+00
+ENDCHAR
+STARTCHAR integraltp
+ENCODING 8992
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR integralbt
+ENCODING 8993
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+20
+20
+40
+ENDCHAR
+STARTCHAR uni23BA
+ENCODING 9146
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BB
+ENCODING 9147
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BC
+ENCODING 9148
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni23BD
+ENCODING 9149
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2409
+ENCODING 9225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240A
+ENCODING 9226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+60
+40
+40
+ENDCHAR
+STARTCHAR uni240B
+ENCODING 9227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240C
+ENCODING 9228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+80
+60
+60
+40
+ENDCHAR
+STARTCHAR uni240D
+ENCODING 9229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+E0
+50
+60
+50
+ENDCHAR
+STARTCHAR uni2423
+ENCODING 9251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+90
+F0
+ENDCHAR
+STARTCHAR uni2424
+ENCODING 9252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+B0
+90
+20
+20
+30
+ENDCHAR
+STARTCHAR SF100000
+ENCODING 9472
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2501
+ENCODING 9473
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+00
+00
+ENDCHAR
+STARTCHAR SF110000
+ENCODING 9474
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2503
+ENCODING 9475
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR uni2504
+ENCODING 9476
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2505
+ENCODING 9477
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni2506
+ENCODING 9478
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2507
+ENCODING 9479
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR uni2508
+ENCODING 9480
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2509
+ENCODING 9481
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni250A
+ENCODING 9482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni250B
+ENCODING 9483
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR SF010000
+ENCODING 9484
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250D
+ENCODING 9485
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250E
+ENCODING 9486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR uni250F
+ENCODING 9487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF030000
+ENCODING 9488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2511
+ENCODING 9489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2512
+ENCODING 9490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2513
+ENCODING 9491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF020000
+ENCODING 9492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2515
+ENCODING 9493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2516
+ENCODING 9494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2517
+ENCODING 9495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR SF040000
+ENCODING 9496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2519
+ENCODING 9497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni251A
+ENCODING 9498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni251B
+ENCODING 9499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF080000
+ENCODING 9500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251D
+ENCODING 9501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251E
+ENCODING 9502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251F
+ENCODING 9503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2520
+ENCODING 9504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2521
+ENCODING 9505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni2522
+ENCODING 9506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2523
+ENCODING 9507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF090000
+ENCODING 9508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2525
+ENCODING 9509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2526
+ENCODING 9510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni2527
+ENCODING 9511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2528
+ENCODING 9512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2529
+ENCODING 9513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni252A
+ENCODING 9514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni252B
+ENCODING 9515
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF060000
+ENCODING 9516
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252D
+ENCODING 9517
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252E
+ENCODING 9518
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252F
+ENCODING 9519
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2530
+ENCODING 9520
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2531
+ENCODING 9521
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2532
+ENCODING 9522
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2533
+ENCODING 9523
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF070000
+ENCODING 9524
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2535
+ENCODING 9525
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2536
+ENCODING 9526
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2537
+ENCODING 9527
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2538
+ENCODING 9528
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2539
+ENCODING 9529
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253A
+ENCODING 9530
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253B
+ENCODING 9531
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF050000
+ENCODING 9532
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253D
+ENCODING 9533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253E
+ENCODING 9534
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253F
+ENCODING 9535
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2540
+ENCODING 9536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2541
+ENCODING 9537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2542
+ENCODING 9538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2543
+ENCODING 9539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2544
+ENCODING 9540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2545
+ENCODING 9541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2546
+ENCODING 9542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2547
+ENCODING 9543
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2548
+ENCODING 9544
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2549
+ENCODING 9545
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254A
+ENCODING 9546
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254B
+ENCODING 9547
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254C
+ENCODING 9548
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254D
+ENCODING 9549
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254E
+ENCODING 9550
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+00
+40
+40
+ENDCHAR
+STARTCHAR uni254F
+ENCODING 9551
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR SF430000
+ENCODING 9552
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF240000
+ENCODING 9553
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR SF510000
+ENCODING 9554
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF520000
+ENCODING 9555
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR SF390000
+ENCODING 9556
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF220000
+ENCODING 9557
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF210000
+ENCODING 9558
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF250000
+ENCODING 9559
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF500000
+ENCODING 9560
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF490000
+ENCODING 9561
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR SF380000
+ENCODING 9562
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF280000
+ENCODING 9563
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+00
+ENDCHAR
+STARTCHAR SF270000
+ENCODING 9564
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF260000
+ENCODING 9565
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR SF360000
+ENCODING 9566
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF370000
+ENCODING 9567
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR SF420000
+ENCODING 9568
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF190000
+ENCODING 9569
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF200000
+ENCODING 9570
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF230000
+ENCODING 9571
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF470000
+ENCODING 9572
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+40
+ENDCHAR
+STARTCHAR SF480000
+ENCODING 9573
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF410000
+ENCODING 9574
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR SF450000
+ENCODING 9575
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF460000
+ENCODING 9576
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF400000
+ENCODING 9577
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF540000
+ENCODING 9578
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+40
+F0
+40
+ENDCHAR
+STARTCHAR SF530000
+ENCODING 9579
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF440000
+ENCODING 9580
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR uni256D
+ENCODING 9581
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+30
+40
+40
+ENDCHAR
+STARTCHAR uni256E
+ENCODING 9582
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+80
+40
+40
+ENDCHAR
+STARTCHAR uni256F
+ENCODING 9583
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+80
+00
+00
+ENDCHAR
+STARTCHAR uni2570
+ENCODING 9584
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+30
+00
+00
+ENDCHAR
+STARTCHAR uni2571
+ENCODING 9585
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+20
+40
+40
+80
+ENDCHAR
+STARTCHAR uni2572
+ENCODING 9586
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+20
+20
+10
+ENDCHAR
+STARTCHAR uni2573
+ENCODING 9587
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+60
+90
+90
+ENDCHAR
+STARTCHAR uni2574
+ENCODING 9588
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2575
+ENCODING 9589
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2576
+ENCODING 9590
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2577
+ENCODING 9591
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2578
+ENCODING 9592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2579
+ENCODING 9593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+00
+00
+ENDCHAR
+STARTCHAR uni257A
+ENCODING 9594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni257B
+ENCODING 9595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257C
+ENCODING 9596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+30
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257D
+ENCODING 9597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257E
+ENCODING 9598
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257F
+ENCODING 9599
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+40
+40
+ENDCHAR
+STARTCHAR upblock
+ENCODING 9600
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2581
+ENCODING 9601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2582
+ENCODING 9602
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F8
+ENDCHAR
+STARTCHAR uni2583
+ENCODING 9603
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F8
+F8
+ENDCHAR
+STARTCHAR dnblock
+ENCODING 9604
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2585
+ENCODING 9605
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2586
+ENCODING 9606
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2587
+ENCODING 9607
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR block
+ENCODING 9608
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2589
+ENCODING 9609
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni258A
+ENCODING 9610
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni258B
+ENCODING 9611
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR lfblock
+ENCODING 9612
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258D
+ENCODING 9613
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258E
+ENCODING 9614
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR uni258F
+ENCODING 9615
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR rtblock
+ENCODING 9616
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ltshade
+ENCODING 9617
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+80
+20
+80
+20
+ENDCHAR
+STARTCHAR shade
+ENCODING 9618
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A8
+50
+A8
+50
+A8
+50
+ENDCHAR
+STARTCHAR dkshade
+ENCODING 9619
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B8
+E8
+B8
+E8
+B8
+E8
+ENDCHAR
+STARTCHAR uni2594
+ENCODING 9620
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2595
+ENCODING 9621
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR filledbox
+ENCODING 9632
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR H22073
+ENCODING 9633
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uni25C6
+ENCODING 9670
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR spade
+ENCODING 9824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR club
+ENCODING 9827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+E0
+00
+ENDCHAR
+STARTCHAR heart
+ENCODING 9829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR diamond
+ENCODING 9830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2669
+ENCODING 9833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnote
+ENCODING 9834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnotedbl
+ENCODING 9835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+50
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266C
+ENCODING 9836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+70
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266D
+ENCODING 9837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni266E
+ENCODING 9838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+A0
+E0
+20
+00
+ENDCHAR
+STARTCHAR uni266F
+ENCODING 9839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uniFFFD
+ENCODING 65533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+90
+D0
+F0
+D0
+F0
+ENDCHAR
+ENDFONT
diff --git a/src/col64/cruft/col64font_ext.hex b/src/col64/cruft/col64font_ext.hex
new file mode 100644
index 0000000..2fefbf5
--- /dev/null
+++ b/src/col64/cruft/col64font_ext.hex
@@ -0,0 +1,920 @@
+0000:A000A000A000
+0020:000000000000
+0021:404040004000
+0022:A0A000000000
+0023:A0F0A0F0A000
+0024:70A06050E000
+0025:009020409000
+0026:40A040A0D000
+0027:202040000000
+0028:204040402000
+0029:402020204000
+002A:A040E040A000
+002B:4040E0404000
+002C:000000204000
+002D:0000F0000000
+002E:000000004000
+002F:202040808000
+0030:6090B0D06000
+0031:40C04040E000
+0032:60902040F000
+0033:E0106010E000
+0034:2060A0F02000
+0035:F080E010E000
+0036:7080E0906000
+0037:F01020404000
+0038:609060906000
+0039:60907010E000
+003A:004000004000
+003B:002000204000
+003C:204080402000
+003D:00F000F00000
+003E:804020408000
+003F:709020002000
+0040:60B0B0806000
+0041:6090F0909000
+0042:E090E090E000
+0043:609080906000
+0044:E0909090E000
+0045:F080E080F000
+0046:F080E0808000
+0047:7080B0906000
+0048:9090F0909000
+0049:E0404040E000
+004A:301010906000
+004B:90A0C0A09000
+004C:80808080F000
+004D:A0F0D0909000
+004E:90D0B0909000
+004F:609090906000
+0050:E090E0808000
+0051:609090A05000
+0052:E090E0A09000
+0053:70806010E000
+0054:F04040404000
+0055:909090906000
+0056:909090A04000
+0057:9090D0F0A000
+0058:909060909000
+0059:909060204000
+005A:F0204080F000
+005B:604040406000
+005C:808040202000
+005D:602020206000
+005E:40A000000000
+005F:00000000F000
+0060:404020000000
+0061:007090B05000
+0062:8080E090E000
+0063:007080807000
+0064:101070907000
+0065:006090E07000
+0066:6040E0404000
+0067:007090701000
+0068:8080E0909000
+0069:4000C040E000
+006A:200060202000
+006B:80A0C0A09000
+006C:C0404040E000
+006D:00A0F0D09000
+006E:00E090909000
+006F:006090906000
+0070:00E090E08000
+0071:007090701000
+0072:00A0D0808000
+0073:0070C030E000
+0074:40E040402000
+0075:009090906000
+0076:009090A04000
+0077:0090D0F0A000
+0078:009060609000
+0079:009090602000
+007A:00F02040F000
+007B:604080406000
+007C:404040404000
+007D:C0402040C000
+007E:0050A0000000
+007F:60C08010C000
+00A0:000000000000
+00A1:400040404000
+00A2:40E080E04000
+00A3:20406040A000
+00A4:009060609000
+00A5:A040E0404000
+00A6:404000404000
+00A7:60C0A06020C0
+00A8:A00000000000
+00A9:6090D0D09060
+00AA:60A06000E000
+00AB:0050A0500000
+00AC:0000E0200000
+00AD:0000E0000000
+00AE:60F0D0600000
+00AF:E00000000000
+00B0:40A040000000
+00B1:40E04000E000
+00B2:C04080C00000
+00B3:C04080408000
+00B4:204000000000
+00B5:00A0A0A0C080
+00B6:70D0D0505000
+00B7:000040000000
+00B8:000000204000
+00B9:40C040400000
+00BA:40A04000E000
+00BB:00A050A00000
+00BC:808080507010
+00BD:8080B0102030
+00BE:C0408050B010
+00BF:400040806000
+00C0:8040A0E0A000
+00C1:2040A0E0A000
+00C2:C040A0E0A000
+00C3:60C0A0E0A000
+00C4:A040A0E0A000
+00C5:4040A0E0A000
+00C6:70A0F0A0B000
+00C7:40A080A04080
+00C8:80E0C080E000
+00C9:20E0C080E000
+00CA:60E0C080E000
+00CB:A0E0C080E000
+00CC:80E04040E000
+00CD:20E04040E000
+00CE:40E04040E000
+00CF:A0404040E000
+00D0:E050D050E000
+00D1:50A0E0E0A000
+00D2:8040A0A04000
+00D3:2040A0A04000
+00D4:4040A0A04000
+00D5:70E0A0A04000
+00D6:A040A0A04000
+00D7:00A040A00000
+00D8:60A0E0A0C000
+00D9:8040A0A0E000
+00DA:2040A0A0E000
+00DB:4000A0A0E000
+00DC:A000A0A0E000
+00DD:2000A0404000
+00DE:80C0A0C08000
+00DF:40A0C0A0E080
+00E0:804060A06000
+00E1:204060A06000
+00E2:600060A06000
+00E3:50A060A06000
+00E4:A00060A06000
+00E5:400060A06000
+00E6:0070B0A07000
+00E7:0040A0806040
+00E8:8040A0C06000
+00E9:2040A0C06000
+00EA:C040A0C06000
+00EB:A040A0C06000
+00EC:80404040E000
+00ED:20C04040E000
+00EE:40A04040E000
+00EF:A000C040E000
+00F0:A04060A04000
+00F1:50A0C0A0A000
+00F2:804040A04000
+00F3:204040A04000
+00F4:400040A04000
+00F5:E00040A04000
+00F6:A00040A04000
+00F7:4000E0004000
+00F8:0060A0A0C000
+00F9:8040A0A06000
+00FA:2040A0A06000
+00FB:4000A0A06000
+00FC:A000A0A06000
+00FD:2040A0E020C0
+00FE:8080C0A0C080
+00FF:A000A0E020C0
+0100:E040A0E0A000
+0101:E00060A06000
+0102:A040A0E0A000
+0103:A04060A06000
+0104:0040A0E0A020
+0105:000060A06020
+0106:60A080A04000
+0107:2040A0806000
+0108:E0A080A04000
+0109:600060806000
+010A:40E080A04000
+010B:400060806000
+010C:E0A080A04000
+010D:A04060806000
+010E:E0C0A0A0C000
+010F:302060A06000
+0110:C0A0E0A0C000
+0111:602060A06000
+0112:E0E0C080E000
+0113:E040A0C06000
+0114:A0E0C080E000
+0115:A040A0C06000
+0116:40E0C080E000
+0117:4040A0C06000
+0118:E080C080E020
+0119:0040A0C06040
+011A:A0E0C080E000
+011B:A040A0C06000
+011C:606080A06000
+011D:6060A06020C0
+011E:A06080A06000
+011F:A040A06020C0
+0120:406080A06000
+0121:4060A06020C0
+0122:6080A0A04040
+0123:4060A06020C0
+0124:6000A0E0A000
+0125:40A0C0A0A000
+0126:A0E0A0E0A000
+0127:80C0C0A0A000
+0128:50A04040E000
+0129:50A0C040E000
+012A:E000E040E000
+012B:E000C040E000
+012C:A040E040E000
+012D:A040C040E000
+012E:E0404040E020
+012F:4000C040E020
+0130:4000E040E000
+0131:0000C040E000
+0132:80A0A0A02060
+0133:A000A0A02040
+0134:60A020A04000
+0135:40A0002020C0
+0136:A0A0C0A02040
+0137:80A0C0A02040
+0138:00A0A0C0A000
+0139:40808080E000
+013A:20C04040E000
+013B:80808080E020
+013C:C0404040E020
+013D:A0C08080E000
+013E:D0404040E000
+013F:8080A080E000
+0140:C0405040E000
+0141:80A0C080E000
+0142:C060C040E000
+0143:20A0E0A08000
+0144:2040C0A0A000
+0145:20A0E0A08020
+0146:00C0A0A00040
+0147:20A0E0A08000
+0148:A040C0A0A000
+0149:8000C0A0A000
+014A:A0E0E0A02040
+014B:00C0A0A02040
+014C:E040A0A04000
+014D:E00040A04000
+014E:A040A0A04000
+014F:A04040A04000
+0150:A040A0A04000
+0151:A0A040A04000
+0152:50A0B0A07000
+0153:0070B0A07000
+0154:20C0A0C0A000
+0155:2000A0C08000
+0156:C0A0C0A00040
+0157:00A0C0808020
+0158:60C0A0C0A000
+0159:6000A0C08000
+015A:2060C020C000
+015B:2060C020C000
+015C:6060C020C000
+015D:6060C020C000
+015E:60804020C040
+015F:0060C020E040
+0160:6060C020E000
+0161:6060C020C000
+0162:E04040402040
+0163:40E040402040
+0164:A040E0404000
+0165:A040E0402000
+0166:E040E0404000
+0167:E040E0402000
+0168:D020A0A0E000
+0169:50A000A06000
+016A:E000A0A0E000
+016B:E000A0A06000
+016C:A040A0A0E000
+016D:A04000A06000
+016E:4000A0A0E000
+016F:4000A0A06000
+0170:A000A0A0E000
+0171:A000A0A06000
+0172:00A0A0A04020
+0173:00A0A0A06040
+0174:40A0A0E0A000
+0175:4000A0E0E000
+0176:6000A0404000
+0177:4000A0408000
+0178:A000A0404000
+0179:40E04080E000
+017A:40E04080E000
+017B:40E04080E000
+017C:40E04080E000
+017D:A0E04080E000
+017E:A0E04080E000
+017F:2040C0404000
+018F:00C060A04000
+0192:2040E0404080
+0218:60804020C040
+0219:0060C020E040
+021A:E04040400040
+021B:40E040402040
+0259:00C060A04000
+02C6:40A000000000
+02C7:A04000000000
+02C9:E00000000000
+02D8:906000000000
+02D9:400000000000
+02DA:40A040000000
+02DB:0000004080C0
+02DC:50A000000000
+02DD:A0A000000000
+0374:204000000000
+0375:000000004080
+037A:000000004060
+037E:004000004080
+0384:204000000000
+0385:B04000000000
+0386:C0A0E0A0A000
+0387:000040000000
+0388:E0C060406000
+0389:A020E0A0A000
+038A:E0C04040E000
+038C:C0A0A0A04000
+038E:A0A0C0404000
+038F:C0A0A040A000
+0390:B04000402000
+0391:40A0E0A0A000
+0392:C0A0C0A0C000
+0393:E08080808000
+0394:4040A0A0E000
+0395:E080C080E000
+0396:E0204080E000
+0397:A0A0E0A0A000
+0398:40A0E0A04000
+0399:E0404040E000
+039A:A0A0C0A0A000
+039B:4040A0A0A000
+039C:A0E0A0A0A000
+039D:20A0E0A08000
+039E:E0004000E000
+039F:40A0A0A04000
+03A0:E0A0A0A0A000
+03A1:C0A0C0808000
+03A3:E0804080E000
+03A4:E04040404000
+03A5:A0A040404000
+03A6:40E0A0E04000
+03A7:A0A040A0A000
+03A8:A0E0E0404000
+03A9:40A0A040A000
+03AA:A000E040E000
+03AB:A000A0404000
+03AC:408060A06000
+03AD:20C040806000
+03AE:2040C0A02040
+03AF:200040402000
+03B0:B040A0A0C000
+03B1:0050A0A05000
+03B2:40A0C0A0C000
+03B3:00A060404000
+03B4:608040A04000
+03B5:00E0C0806000
+03B6:E04080E02040
+03B7:00C0A0A02040
+03B8:40A0E0A04000
+03B9:004040402000
+03BA:00A0A0C0A000
+03BB:C02060A0A000
+03BC:00A0A0A0C080
+03BD:00A0A0604000
+03BE:60A040806000
+03BF:0040A0A04000
+03C0:00E0A0A0A000
+03C1:0040A0A0C080
+03C2:00608040C000
+03C3:0060C0A04000
+03C4:00E040402000
+03C5:0080A0A0C000
+03C6:0040E0A04040
+03C7:00A04060A000
+03C8:00A0E0E04000
+03C9:00A0A0E0E000
+03CA:A00040402000
+03CB:A000A0A0C000
+03CC:204040A04000
+03CD:2000A0A0C000
+03CE:2000A0E0E000
+0401:A0E0C080E000
+0402:E080C0A0A000
+0403:20E080808000
+0404:6080C0806000
+0405:60804020C000
+0406:E0404040E000
+0407:A0E04040E000
+0408:202020A04000
+0409:E060A0B0B000
+040A:A0A0E0B0B000
+040B:C080C0A0A000
+040C:2080A0C0A000
+040E:A04000A04080
+040F:A0A0A0A0E040
+0410:40A0E0A0A000
+0411:E080C0A0C000
+0412:C0A0C0A0C000
+0413:E08080808000
+0414:E060A0A0E0A0
+0415:E080C080E000
+0416:A0E040E0A000
+0417:C0204020C000
+0418:80A0E0A02000
+0419:6080A0E0A020
+041A:A0A0C0A0A000
+041B:60A0A0A0A000
+041C:A0E0A0A0A000
+041D:A0A0E0A0A000
+041E:40A0A0A04000
+041F:E0A0A0A0A000
+0420:C0A0C0808000
+0421:40A080A04000
+0422:E04040404000
+0423:A0A0A0404080
+0424:40E0A0E04000
+0425:A0A040A0A000
+0426:A0A0A0A0E000
+0427:A0A060202000
+0428:A0A0E0E0E000
+0429:A0A0E0E0F010
+042A:C04060506000
+042B:9090D0B0D000
+042C:8080C0A0C000
+042D:C0206020C000
+042E:A0D0D0D0A000
+042F:60A060A0A000
+0430:0060A0A06000
+0431:6080E0A04000
+0432:00E0C0A0C000
+0433:00E080808000
+0434:0060A0A0E0A0
+0435:0040A0C06000
+0436:00B06060B000
+0437:00E04020C000
+0438:00A0E0E0A000
+0439:A040A0E0A000
+043A:00A0A0C0A000
+043B:0060A0A0A000
+043C:00A0E0A0A000
+043D:00A0E0A0A000
+043E:0040A0A04000
+043F:00E0A0A0A000
+0440:00C0A0C08080
+0441:006080806000
+0442:00E040404000
+0443:00A0A06020C0
+0444:4040A0A04040
+0445:00A04040A000
+0446:00A0A0A0E020
+0447:00A0A0602000
+0448:00A0E0E0E000
+0449:00A0E0E0F010
+044A:00C060506000
+044B:0090D0B0D000
+044C:0080C0A0C000
+044D:00C06020C000
+044E:00A0D0D0A000
+044F:0060A060A000
+0451:A040A0C06000
+0452:80C080C0A020
+0453:2040E0808000
+0454:0060C0806000
+0455:0060C020C000
+0456:4000C040E000
+0457:A000C040E000
+0458:2000202020C0
+0459:0060A0B0B000
+045A:00A0E0B0B000
+045B:80C080C0A000
+045C:2080A0C0A000
+045E:A04000A04080
+045F:00A0A0A0E040
+0490:20E080808000
+0491:0020E0808000
+0492:6040E0404000
+0493:006040E04000
+05D0:00A060C0A000
+05D1:00E02020F000
+05D2:80404040A000
+05D3:00E020202000
+05D4:80E020A0A000
+05D5:402020202000
+05D6:806040404000
+05D7:00E0A0A0A000
+05D8:A0A0A0A0C000
+05D9:C02020000000
+05DA:00E020202020
+05DB:00E02020C000
+05DC:80E020204000
+05DD:8060A0A0E000
+05DE:8060A0A0A000
+05DF:806020202000
+05E0:402020206000
+05E1:8060A0A04000
+05E2:A0A0A060C000
+05E3:00E0A0202020
+05E4:00E0A020E000
+05E5:00A0A0C08080
+05E6:00A04020E000
+05E7:00E020C08080
+05E8:00C020202000
+05E9:00F0D0A0E000
+05EA:8060A0A0A000
+1E02:40E0C0A0C000
+1E03:A080C0A0C000
+1E0A:40C0A0A0C000
+1E0B:A02060A06000
+1E1E:40E080C08000
+1E1F:802040E04000
+1E40:4000E0A0A000
+1E41:4000A0E0A000
+1E56:40C0A0C08000
+1E57:4000C0A0C080
+1E60:40E0C020C000
+1E61:4060C020C000
+1E6A:40E040404000
+1E6B:400040E04020
+1E80:8020A0E0E000
+1E81:8040A0A0E000
+1E82:2080A0E0E000
+1E83:2040A0A0E000
+1E84:A000A0E0E000
+1E85:A000A0E0E000
+1EF2:8020A0404000
+1EF3:8040A0602040
+2010:000060000000
+2011:000060000000
+2012:0000E0000000
+2013:0000E0000000
+2014:0000F0000000
+2015:0000F0000000
+2016:A0A0A0A0A0A0
+2017:000000F000F0
+2018:204060000000
+2019:602040000000
+201A:000000602040
+201B:604020000000
+201C:50A0A0000000
+201D:5050A0000000
+201E:0000005050A0
+201F:A0A050000000
+2020:40E040404000
+2021:40E040E04000
+2022:0040E0400000
+2023:00C0E0C00000
+2024:000000004000
+2025:00000000A000
+2026:00000000B000
+2027:000040000000
+2030:802040803000
+2039:004080400000
+203A:004020400000
+203E:F80000000000
+207F:00C0A0A00000
+20A7:60F060404000
+20AC:2040E0402000
+2116:C0B0B0A0B000
+2122:E04000E0A000
+2126:40A0A040A000
+2127:A040A0A04000
+215B:8080B0205020
+215C:C040B060D020
+215D:C08070A05020
+215E:C040B0A05020
+2190:0040F0400000
+2191:0040E0404000
+2192:0020F0200000
+2193:004040E04000
+2194:0050F0500000
+2195:40E040E04000
+2200:A0A0E0A04000
+2201:40A080A04000
+2202:C02060A04000
+2203:E020E020E000
+2204:F020E060E080
+2205:2060A0A0C080
+2206:4040A0A0E000
+2207:E0A0A0404000
+2208:6080E0806000
+2209:70A0E0A06040
+220A:4080C0804000
+220B:C020E020C000
+220C:D020E060C080
+220D:8040C0408000
+220E:C0C0C0C0C000
+220F:E0A0A0A0A000
+2210:A0A0A0A0E000
+2211:E0804080E000
+2212:0000E0000000
+2213:E00040E04000
+2214:400040E04000
+2215:202040808000
+2216:808040202000
+2217:20A070E05040
+2218:0040A0400000
+2219:0040E0400000
+221A:302020A06000
+221B:D050D0105030
+221C:D0D050105030
+221D:000050E05000
+221E:0020D0B04000
+221F:00008080E000
+2220:00204080E000
+2221:10A040A0F020
+2222:9060A0A06090
+2223:404040404000
+2224:406040C04000
+2225:A0A0A0A0A000
+2226:A0B0E0A0A000
+2227:004040A0A000
+2228:00A0A0404000
+2229:0040A0A0A000
+222A:00A0A0A04000
+222B:204040404080
+222C:50A0A0A0A080
+222D:50D0D0D0D0A0
+222E:2040E0E04080
+222F:50A0E0E0A080
+2230:50D0F0F0D0A0
+2231:2040E0504080
+2232:2040E0C04080
+2233:2040C0E04080
+2234:00004000A000
+2235:0000A0004000
+2236:000040004000
+2237:0000A000A000
+2238:004000E00000
+2239:000020C02000
+223A:A000E000A000
+223B:200050A00040
+223C:000050A00000
+223D:0000A0500000
+223E:0000D0B00000
+223F:004050A02000
+2240:402040402000
+2241:1020B0D04080
+2242:00E000A05000
+2243:0050A000E000
+2244:20D0B040F040
+2245:50A000E000E0
+2246:50A020F040F0
+2247:70A020F040F0
+2248:50A00050A000
+2249:70A04050E080
+224A:40B040B000F0
+224B:40B040B040B0
+224C:A05000E000E0
+224D:A0400040A000
+224E:40A000A04000
+224F:40A000E00000
+2250:4000E000E000
+2251:40E000E00040
+2252:80E000E00020
+2253:20E000E00080
+2254:00B000B00000
+2255:00D000D00000
+2256:00E040E00000
+2257:40E000E00000
+2258:40E000E00000
+2259:40E000E00000
+225A:A0E000E00000
+225B:40E000E00000
+225C:40E000E00000
+225D:4000E000E000
+225E:4000E000E000
+225F:4000E000E000
+2260:20E040E08000
+2261:E000E000E000
+2262:E020E040E080
+2263:E000E000E000
+2264:2040E000E000
+2265:8040E000E000
+2266:2040E000E000
+2267:8040E000E000
+2268:002040E00000
+2269:008040E00000
+226A:0050A0500000
+226B:00A050A00000
+226C:A040A040A000
+226D:20E040E08000
+226E:2060C0608000
+226F:20C060C08000
+2270:2040E040E080
+2271:A060E040E080
+2272:2040E00050A0
+2273:8040E000A050
+2276:60C0208060C0
+2277:C0608020C060
+2278:60C060C060C0
+2279:C060C060C060
+227A:0020C0200000
+227B:008060800000
+227C:20C02000E000
+227D:80608000E000
+227E:20C02000A050
+227F:20C02000A050
+2280:4060C0604000
+2281:40C060C04000
+2282:006080600000
+2283:00C020C00000
+2284:4060C0604000
+2285:40C060C04000
+2286:60806000E000
+2287:C020C000E000
+2288:60A06040E080
+2289:C060C040E040
+228A:60806040E080
+228B:C020C040E080
+2310:0000E0800000
+2320:204040404040
+2321:202020202040
+23BA:F00000000000
+23BB:00F000000000
+23BC:000000F00000
+23BD:0000000000F0
+2409:A0E0A0702020
+240A:8080E0604040
+240B:A0A040702020
+240C:C0C080606040
+240D:E080E0506050
+2423:0000000090F0
+2424:D0B090202030
+2500:000000F00000
+2501:0000F8F80000
+2502:404040404040
+2503:606060606060
+2504:000000A00000
+2505:0000A8A80000
+2506:400040004000
+2507:600060006000
+2508:000000A00000
+2509:0000A8A80000
+250A:400040004000
+250B:600060006000
+250C:000000704040
+250D:000070704040
+250E:000000706060
+250F:000070706060
+2510:000000C04040
+2511:0000C0C04040
+2512:000000E06060
+2513:0000E0E06060
+2514:404040700000
+2515:404070700000
+2516:606060700000
+2517:606070700000
+2518:404040C00000
+2519:4040C0C00000
+251A:606060E00000
+251B:6060E0E00000
+251C:404040704040
+251D:404070704040
+251E:606060704040
+251F:404040706060
+2520:606060706060
+2521:606070704040
+2522:404070706060
+2523:606070706060
+2524:404040C04040
+2525:4040C0C04040
+2526:606060E04040
+2527:404040E06060
+2528:606060E06060
+2529:6060E0E04040
+252A:4040E0E06060
+252B:6060E0E06060
+252C:000000F04040
+252D:0000C0F04040
+252E:000070F04040
+252F:0000F0F04040
+2530:000000F06060
+2531:0000E0F06060
+2532:000070F06060
+2533:0000F0F06060
+2534:404040F00000
+2535:4040C0F00000
+2536:404070F00000
+2537:4040F0F00000
+2538:606060F00000
+2539:6060E0F00000
+253A:606070F00000
+253B:6060F0F00000
+253C:404040F04040
+253D:4040C0F04040
+253E:404070F04040
+253F:4040F0F04040
+2540:606060F04040
+2541:404040F06060
+2542:606060F06060
+2543:6060E0F04040
+2544:606070F04040
+2545:4040E0F06060
+2546:404070F06060
+2547:6060F0F04040
+2548:4040F0F06060
+2549:6060E0F06060
+254A:606070F06060
+254B:6060F0F06060
+254C:000000A00000
+254D:0000A0A00000
+254E:004040004040
+254F:006060006060
+2550:0000F000F000
+2551:606060606060
+2552:000070407040
+2553:000000706060
+2554:000070407060
+2555:0000C040C040
+2556:000000E06060
+2557:0000E020E060
+2558:404070407000
+2559:606060700000
+255A:606070407000
+255B:4040C040C000
+255C:606060E00000
+255D:6060E020E000
+255E:404070407040
+255F:606060706060
+2560:606070407060
+2561:4040C040C040
+2562:606060E06060
+2563:6060E020E060
+2564:0000F000F040
+2565:000000F06060
+2566:0000F000F060
+2567:4040F000F000
+2568:606060F00000
+2569:6060F000F000
+256A:4040F040F040
+256B:606060F06060
+256C:6060F000F060
+256D:000000304040
+256E:000000804040
+256F:404040800000
+2570:404040300000
+2571:102020404080
+2572:804040202010
+2573:909060609090
+2574:000000C00000
+2575:404040400000
+2576:000000700000
+2577:000000404040
+2578:0000C0C00000
+2579:606060600000
+257A:000070700000
+257B:000000606060
+257C:000030F00000
+257D:404040606060
+257E:0000C0F00000
+257F:606060604040
+2580:F8F8F8000000
+2581:0000000000F0
+2582:0000000000F8
+2583:00000000F8F8
+2584:000000F8F8F8
+2585:000000F8F8F8
+2586:0000F8F8F8F8
+2587:00F8F8F8F8F8
+2588:F8F8F8F8F8F8
+2589:F0F0F0F0F0F0
+258A:E0E0E0E0E0E0
+258B:E0E0E0E0E0E0
+258C:C0C0C0C0C0C0
+258D:C0C0C0C0C0C0
+258E:808080808080
+258F:808080808080
+2590:303030303030
+2591:802080208020
+2592:A850A850A850
+2593:B8E8B8E8B8E8
+2594:F80000000000
+2595:101010101010
+25A0:0000E0E0E000
+25A1:0000E0A0E000
+25C6:0040E0E04000
+2660:40E0E040E000
+2663:0040A040E000
+2665:00A0E0E04000
+2666:0040E0400000
+2669:404040C08000
+266A:406040C08000
+266B:70505050A000
+266C:70705050A000
+266D:8080E0A0C000
+266E:80E0A0E02000
+266F:A0E0A0E0A000
+FFFD:F090D0F0D0F0
diff --git a/src/col64/cruft/col64font_new.bdf b/src/col64/cruft/col64font_new.bdf
new file mode 100644
index 0000000..b28df9e
--- /dev/null
+++ b/src/col64/cruft/col64font_new.bdf
@@ -0,0 +1,11994 @@
+STARTFONT 2.1
+COMMENT Contributed by Janne V. Kujala <jvk@iki.fi>
+COMMENT $Id: 4x6.bdf,v 1.5 2002-08-26 18:05:49+01 mgk25 Rel $
+COMMENT Send bug reports to Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+FONT -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1
+SIZE 6 75 75
+FONTBOUNDINGBOX 4 6 0 -1
+STARTPROPERTIES 23
+FONTNAME_REGISTRY ""
+FOUNDRY "Misc"
+FAMILY_NAME "Fixed"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 6
+POINT_SIZE 60
+RESOLUTION_X 75
+RESOLUTION_Y 75
+SPACING "C"
+AVERAGE_WIDTH 40
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 5
+FONT_DESCENT 1
+DESTINATION 1
+COPYRIGHT "Public domain font. Share and enjoy."
+CAP_HEIGHT 5
+X_HEIGHT 4
+DEFAULT_CHAR 0
+_GBDFED_INFO "Edited with gbdfed 1.4."
+ENDPROPERTIES
+CHARS 920
+STARTCHAR char0
+ENCODING 0
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+A0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+60
+50
+E0
+00
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+20
+40
+90
+00
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+A0
+D0
+00
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+A0
+00
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+B0
+D0
+60
+00
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+10
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+F0
+20
+00
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+10
+E0
+00
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+E0
+90
+60
+00
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+10
+20
+40
+40
+00
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+60
+90
+60
+00
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+70
+10
+E0
+00
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+80
+40
+20
+00
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+20
+40
+80
+00
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+20
+00
+20
+00
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+B0
+B0
+80
+60
+00
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+80
+90
+60
+00
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+90
+90
+E0
+00
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+F0
+00
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+80
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+B0
+90
+60
+00
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+F0
+90
+90
+00
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+10
+10
+90
+60
+00
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+F0
+00
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+F0
+D0
+90
+90
+00
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+D0
+B0
+90
+90
+00
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+90
+A0
+50
+00
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+90
+E0
+A0
+90
+00
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+80
+60
+10
+E0
+00
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+90
+90
+00
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+20
+40
+00
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+40
+80
+F0
+00
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+40
+40
+60
+00
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F0
+00
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+B0
+90
+70
+00
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+E0
+00
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+80
+80
+70
+00
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+70
+90
+70
+00
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+E0
+70
+00
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+90
+70
+10
+60
+00
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+90
+90
+00
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+90
+00
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+F0
+D0
+90
+00
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+90
+90
+00
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+90
+E0
+80
+00
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+90
+70
+10
+00
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+80
+80
+00
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+C0
+30
+E0
+00
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+90
+60
+00
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+90
+A0
+40
+00
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+F0
+A0
+00
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+20
+40
+F0
+00
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+80
+40
+60
+00
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+20
+40
+C0
+00
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+90
+00
+90
+D0
+00
+ENDCHAR
+STARTCHAR space
+ENCODING 160
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+E0
+40
+00
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+40
+A0
+00
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+60
+60
+90
+00
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+00
+40
+40
+00
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+90
+D0
+D0
+90
+60
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+00
+00
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 173
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+D0
+60
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+C0
+00
+00
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+40
+80
+00
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+D0
+D0
+50
+50
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+20
+40
+00
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+50
+70
+10
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+10
+20
+30
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+80
+50
+B0
+10
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+F0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+80
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+50
+D0
+50
+E0
+00
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+E0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+A0
+00
+00
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+E0
+80
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+80
+60
+40
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+40
+00
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+20
+C0
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+A0
+60
+20
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+60
+80
+60
+00
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Dcroat
+ENCODING 272
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR dcroat
+ENCODING 273
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+20
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+40
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+80
+A0
+60
+00
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Hbar
+ENCODING 294
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR hbar
+ENCODING 295
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+20
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+A0
+A0
+20
+60
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+20
+20
+C0
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR kgreenlandic
+ENCODING 312
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+E0
+20
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+40
+40
+E0
+20
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+C0
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+A0
+80
+E0
+00
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+50
+40
+E0
+00
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+20
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+40
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+00
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+A0
+20
+40
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+70
+B0
+A0
+70
+00
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+00
+40
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+C0
+80
+80
+20
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+E0
+00
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 354
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 355
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Tbar
+ENCODING 358
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR tbar
+ENCODING 359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+20
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+60
+40
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+40
+80
+00
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR longs
+ENCODING 383
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni018F
+ENCODING 399
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR florin
+ENCODING 402
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+40
+80
+ENDCHAR
+STARTCHAR Scommaaccent
+ENCODING 536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+40
+ENDCHAR
+STARTCHAR scommaaccent
+ENCODING 537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+E0
+40
+ENDCHAR
+STARTCHAR Tcommaaccent
+ENCODING 538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+00
+40
+ENDCHAR
+STARTCHAR tcommaaccent
+ENCODING 539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+20
+40
+ENDCHAR
+STARTCHAR uni0259
+ENCODING 601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR circumflex
+ENCODING 710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR caron
+ENCODING 711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR macron
+ENCODING 713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR breve
+ENCODING 728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dotaccent
+ENCODING 729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR ring
+ENCODING 730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR ogonek
+ENCODING 731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+80
+C0
+ENDCHAR
+STARTCHAR tilde
+ENCODING 732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR hungarumlaut
+ENCODING 733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0374
+ENCODING 884
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni0375
+ENCODING 885
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR uni037A
+ENCODING 890
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+60
+ENDCHAR
+STARTCHAR uni037E
+ENCODING 894
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+00
+40
+80
+ENDCHAR
+STARTCHAR tonos
+ENCODING 900
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR dieresistonos
+ENCODING 901
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR Alphatonos
+ENCODING 902
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR anoteleia
+ENCODING 903
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR Epsilontonos
+ENCODING 904
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+60
+40
+60
+00
+ENDCHAR
+STARTCHAR Etatonos
+ENCODING 905
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Iotatonos
+ENCODING 906
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+C0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Omicrontonos
+ENCODING 908
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Upsilontonos
+ENCODING 910
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omegatonos
+ENCODING 911
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR iotadieresistonos
+ENCODING 912
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+00
+40
+20
+00
+ENDCHAR
+STARTCHAR Alpha
+ENCODING 913
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Beta
+ENCODING 914
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR Gamma
+ENCODING 915
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR Delta
+ENCODING 916
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Epsilon
+ENCODING 917
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR Zeta
+ENCODING 918
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Eta
+ENCODING 919
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Theta
+ENCODING 920
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Iota
+ENCODING 921
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR Kappa
+ENCODING 922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Lambda
+ENCODING 923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Mu
+ENCODING 924
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Nu
+ENCODING 925
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+E0
+A0
+80
+00
+ENDCHAR
+STARTCHAR Xi
+ENCODING 926
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+00
+E0
+00
+ENDCHAR
+STARTCHAR Omicron
+ENCODING 927
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR Pi
+ENCODING 928
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Rho
+ENCODING 929
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR Sigma
+ENCODING 931
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR Tau
+ENCODING 932
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Upsilon
+ENCODING 933
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR Phi
+ENCODING 934
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR Chi
+ENCODING 935
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR Psi
+ENCODING 936
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 937
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR Iotadieresis
+ENCODING 938
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR Upsilondieresis
+ENCODING 939
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR alphatonos
+ENCODING 940
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR epsilontonos
+ENCODING 941
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR etatonos
+ENCODING 942
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+A0
+20
+40
+ENDCHAR
+STARTCHAR iotatonos
+ENCODING 943
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresistonos
+ENCODING 944
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B0
+40
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR alpha
+ENCODING 945
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+A0
+50
+00
+ENDCHAR
+STARTCHAR beta
+ENCODING 946
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR gamma
+ENCODING 947
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR delta
+ENCODING 948
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR epsilon
+ENCODING 949
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR zeta
+ENCODING 950
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+80
+E0
+20
+40
+ENDCHAR
+STARTCHAR eta
+ENCODING 951
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+20
+40
+ENDCHAR
+STARTCHAR theta
+ENCODING 952
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR iota
+ENCODING 953
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR kappa
+ENCODING 954
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR lambda
+ENCODING 955
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR mu
+ENCODING 956
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR nu
+ENCODING 957
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+40
+00
+ENDCHAR
+STARTCHAR xi
+ENCODING 958
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+40
+80
+60
+00
+ENDCHAR
+STARTCHAR omicron
+ENCODING 959
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR pi
+ENCODING 960
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR rho
+ENCODING 961
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR sigma1
+ENCODING 962
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+40
+C0
+00
+ENDCHAR
+STARTCHAR sigma
+ENCODING 963
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+A0
+40
+00
+ENDCHAR
+STARTCHAR tau
+ENCODING 964
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilon
+ENCODING 965
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR phi
+ENCODING 966
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+A0
+40
+40
+ENDCHAR
+STARTCHAR chi
+ENCODING 967
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+60
+A0
+00
+ENDCHAR
+STARTCHAR psi
+ENCODING 968
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR omega
+ENCODING 969
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR iotadieresis
+ENCODING 970
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR upsilondieresis
+ENCODING 971
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omicrontonos
+ENCODING 972
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+A0
+40
+00
+ENDCHAR
+STARTCHAR upsilontonos
+ENCODING 973
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR omegatonos
+ENCODING 974
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10023
+ENCODING 1025
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10051
+ENCODING 1026
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10052
+ENCODING 1027
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10053
+ENCODING 1028
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10054
+ENCODING 1029
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10055
+ENCODING 1030
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10056
+ENCODING 1031
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10057
+ENCODING 1032
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10058
+ENCODING 1033
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10059
+ENCODING 1034
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10060
+ENCODING 1035
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10061
+ENCODING 1036
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10062
+ENCODING 1038
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10145
+ENCODING 1039
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10017
+ENCODING 1040
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10018
+ENCODING 1041
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10019
+ENCODING 1042
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10020
+ENCODING 1043
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10021
+ENCODING 1044
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10022
+ENCODING 1045
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+C0
+80
+E0
+00
+ENDCHAR
+STARTCHAR afii10024
+ENCODING 1046
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+40
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10025
+ENCODING 1047
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10026
+ENCODING 1048
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+A0
+E0
+A0
+20
+00
+ENDCHAR
+STARTCHAR afii10027
+ENCODING 1049
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+A0
+E0
+A0
+20
+ENDCHAR
+STARTCHAR afii10028
+ENCODING 1050
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+C0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10029
+ENCODING 1051
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10030
+ENCODING 1052
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10031
+ENCODING 1053
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10032
+ENCODING 1054
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10033
+ENCODING 1055
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10034
+ENCODING 1056
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+A0
+C0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10035
+ENCODING 1057
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10036
+ENCODING 1058
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10037
+ENCODING 1059
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+40
+40
+80
+ENDCHAR
+STARTCHAR afii10038
+ENCODING 1060
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+A0
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii10039
+ENCODING 1061
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10040
+ENCODING 1062
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii10041
+ENCODING 1063
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+60
+20
+20
+00
+ENDCHAR
+STARTCHAR afii10042
+ENCODING 1064
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10043
+ENCODING 1065
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10044
+ENCODING 1066
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10045
+ENCODING 1067
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10046
+ENCODING 1068
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10047
+ENCODING 1069
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10048
+ENCODING 1070
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+D0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10049
+ENCODING 1071
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10065
+ENCODING 1072
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+60
+00
+ENDCHAR
+STARTCHAR afii10066
+ENCODING 1073
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10067
+ENCODING 1074
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10068
+ENCODING 1075
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10069
+ENCODING 1076
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+E0
+A0
+ENDCHAR
+STARTCHAR afii10070
+ENCODING 1077
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10072
+ENCODING 1078
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+60
+60
+B0
+00
+ENDCHAR
+STARTCHAR afii10073
+ENCODING 1079
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10074
+ENCODING 1080
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10075
+ENCODING 1081
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR afii10076
+ENCODING 1082
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10077
+ENCODING 1083
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10078
+ENCODING 1084
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10079
+ENCODING 1085
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10080
+ENCODING 1086
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii10081
+ENCODING 1087
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii10082
+ENCODING 1088
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii10083
+ENCODING 1089
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10084
+ENCODING 1090
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii10085
+ENCODING 1091
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+C0
+ENDCHAR
+STARTCHAR afii10086
+ENCODING 1092
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+40
+40
+ENDCHAR
+STARTCHAR afii10087
+ENCODING 1093
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii10088
+ENCODING 1094
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+20
+ENDCHAR
+STARTCHAR afii10089
+ENCODING 1095
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+60
+20
+00
+ENDCHAR
+STARTCHAR afii10090
+ENCODING 1096
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR afii10091
+ENCODING 1097
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+F0
+10
+ENDCHAR
+STARTCHAR afii10092
+ENCODING 1098
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+50
+60
+00
+ENDCHAR
+STARTCHAR afii10093
+ENCODING 1099
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+90
+D0
+B0
+D0
+00
+ENDCHAR
+STARTCHAR afii10094
+ENCODING 1100
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii10095
+ENCODING 1101
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+60
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10096
+ENCODING 1102
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+D0
+D0
+A0
+00
+ENDCHAR
+STARTCHAR afii10097
+ENCODING 1103
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+60
+A0
+00
+ENDCHAR
+STARTCHAR afii10071
+ENCODING 1105
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+C0
+60
+00
+ENDCHAR
+STARTCHAR afii10099
+ENCODING 1106
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+20
+ENDCHAR
+STARTCHAR afii10100
+ENCODING 1107
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10101
+ENCODING 1108
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+80
+60
+00
+ENDCHAR
+STARTCHAR afii10102
+ENCODING 1109
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii10103
+ENCODING 1110
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10104
+ENCODING 1111
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+C0
+40
+E0
+00
+ENDCHAR
+STARTCHAR afii10105
+ENCODING 1112
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR afii10106
+ENCODING 1113
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+A0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10107
+ENCODING 1114
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+B0
+B0
+00
+ENDCHAR
+STARTCHAR afii10108
+ENCODING 1115
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+C0
+80
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10109
+ENCODING 1116
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii10110
+ENCODING 1118
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+A0
+40
+80
+ENDCHAR
+STARTCHAR afii10193
+ENCODING 1119
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+E0
+40
+ENDCHAR
+STARTCHAR afii10050
+ENCODING 1168
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+80
+80
+80
+00
+ENDCHAR
+STARTCHAR afii10098
+ENCODING 1169
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+E0
+80
+80
+00
+ENDCHAR
+STARTCHAR uni0492
+ENCODING 1170
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR uni0493
+ENCODING 1171
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR afii57664
+ENCODING 1488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+60
+C0
+A0
+00
+ENDCHAR
+STARTCHAR afii57665
+ENCODING 1489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+F0
+00
+ENDCHAR
+STARTCHAR afii57666
+ENCODING 1490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+40
+A0
+00
+ENDCHAR
+STARTCHAR afii57667
+ENCODING 1491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57668
+ENCODING 1492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57669
+ENCODING 1493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57670
+ENCODING 1494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR afii57671
+ENCODING 1495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57672
+ENCODING 1496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR afii57673
+ENCODING 1497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR afii57674
+ENCODING 1498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57675
+ENCODING 1499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+20
+C0
+00
+ENDCHAR
+STARTCHAR afii57676
+ENCODING 1500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+20
+20
+40
+00
+ENDCHAR
+STARTCHAR afii57677
+ENCODING 1501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57678
+ENCODING 1502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR afii57679
+ENCODING 1503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57680
+ENCODING 1504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+20
+20
+60
+00
+ENDCHAR
+STARTCHAR afii57681
+ENCODING 1505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR afii57682
+ENCODING 1506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+60
+C0
+00
+ENDCHAR
+STARTCHAR afii57683
+ENCODING 1507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR afii57684
+ENCODING 1508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+A0
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57685
+ENCODING 1509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57686
+ENCODING 1510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+40
+20
+E0
+00
+ENDCHAR
+STARTCHAR afii57687
+ENCODING 1511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+20
+C0
+80
+80
+ENDCHAR
+STARTCHAR afii57688
+ENCODING 1512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+20
+20
+00
+ENDCHAR
+STARTCHAR afii57689
+ENCODING 1513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+D0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR afii57690
+ENCODING 1514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E02
+ENCODING 7682
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E03
+ENCODING 7683
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+80
+C0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0A
+ENCODING 7690
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni1E0B
+ENCODING 7691
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+20
+60
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni1E1E
+ENCODING 7710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+80
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E1F
+ENCODING 7711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni1E40
+ENCODING 7744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E41
+ENCODING 7745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uni1E56
+ENCODING 7766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+A0
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni1E57
+ENCODING 7767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+C0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR uni1E60
+ENCODING 7776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E61
+ENCODING 7777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni1E6A
+ENCODING 7786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni1E6B
+ENCODING 7787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+20
+ENDCHAR
+STARTCHAR Wgrave
+ENCODING 7808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wgrave
+ENCODING 7809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wacute
+ENCODING 7810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+80
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wacute
+ENCODING 7811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR Wdieresis
+ENCODING 7812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR wdieresis
+ENCODING 7813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+A0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR Ygrave
+ENCODING 7922
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR ygrave
+ENCODING 7923
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+A0
+60
+20
+40
+ENDCHAR
+STARTCHAR uni2010
+ENCODING 8208
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2011
+ENCODING 8209
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2016
+ENCODING 8214
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR underscoredbl
+ENCODING 8215
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+F0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+60
+00
+00
+00
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+20
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR quotesinglbase
+ENCODING 8218
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+20
+40
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+40
+20
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+50
+A0
+00
+00
+00
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+50
+50
+A0
+ENDCHAR
+STARTCHAR uni201F
+ENCODING 8223
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+50
+00
+00
+00
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2023
+ENCODING 8227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+E0
+C0
+00
+00
+ENDCHAR
+STARTCHAR onedotenleader
+ENCODING 8228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+40
+00
+ENDCHAR
+STARTCHAR twodotenleader
+ENCODING 8229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+A0
+00
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+B0
+00
+ENDCHAR
+STARTCHAR uni2027
+ENCODING 8231
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+00
+00
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+40
+80
+30
+00
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+80
+40
+00
+00
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+20
+40
+00
+00
+ENDCHAR
+STARTCHAR uni203E
+ENCODING 8254
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR nsuperior
+ENCODING 8319
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR peseta
+ENCODING 8359
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+F0
+60
+40
+40
+00
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+20
+00
+ENDCHAR
+STARTCHAR afii61352
+ENCODING 8470
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+B0
+B0
+A0
+B0
+00
+ENDCHAR
+STARTCHAR trademark
+ENCODING 8482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+40
+00
+E0
+A0
+00
+ENDCHAR
+STARTCHAR Omega
+ENCODING 8486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni2127
+ENCODING 8487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR oneeighth
+ENCODING 8539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+B0
+20
+50
+20
+ENDCHAR
+STARTCHAR threeeighths
+ENCODING 8540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+60
+D0
+20
+ENDCHAR
+STARTCHAR fiveeighths
+ENCODING 8541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+80
+70
+A0
+50
+20
+ENDCHAR
+STARTCHAR seveneighths
+ENCODING 8542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+40
+B0
+A0
+50
+20
+ENDCHAR
+STARTCHAR arrowleft
+ENCODING 8592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+F0
+40
+00
+00
+ENDCHAR
+STARTCHAR arrowup
+ENCODING 8593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+40
+00
+ENDCHAR
+STARTCHAR arrowright
+ENCODING 8594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+F0
+20
+00
+00
+ENDCHAR
+STARTCHAR arrowdown
+ENCODING 8595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR arrowboth
+ENCODING 8596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+F0
+50
+00
+00
+ENDCHAR
+STARTCHAR arrowupdn
+ENCODING 8597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR universal
+ENCODING 8704
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+E0
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni2201
+ENCODING 8705
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+80
+A0
+40
+00
+ENDCHAR
+STARTCHAR partialdiff
+ENCODING 8706
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+60
+A0
+40
+00
+ENDCHAR
+STARTCHAR existential
+ENCODING 8707
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR uni2204
+ENCODING 8708
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+20
+E0
+60
+E0
+80
+ENDCHAR
+STARTCHAR emptyset
+ENCODING 8709
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+A0
+A0
+C0
+80
+ENDCHAR
+STARTCHAR Delta
+ENCODING 8710
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR gradient
+ENCODING 8711
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR element
+ENCODING 8712
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+E0
+80
+60
+00
+ENDCHAR
+STARTCHAR notelement
+ENCODING 8713
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+E0
+A0
+60
+40
+ENDCHAR
+STARTCHAR uni220A
+ENCODING 8714
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+80
+C0
+80
+40
+00
+ENDCHAR
+STARTCHAR suchthat
+ENCODING 8715
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+E0
+20
+C0
+00
+ENDCHAR
+STARTCHAR uni220C
+ENCODING 8716
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+20
+E0
+60
+C0
+80
+ENDCHAR
+STARTCHAR uni220D
+ENCODING 8717
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+C0
+40
+80
+00
+ENDCHAR
+STARTCHAR uni220E
+ENCODING 8718
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+00
+ENDCHAR
+STARTCHAR product
+ENCODING 8719
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2210
+ENCODING 8720
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR summation
+ENCODING 8721
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2213
+ENCODING 8723
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR uni2214
+ENCODING 8724
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+E0
+40
+00
+ENDCHAR
+STARTCHAR fraction
+ENCODING 8725
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+40
+80
+80
+00
+ENDCHAR
+STARTCHAR uni2216
+ENCODING 8726
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+40
+20
+20
+00
+ENDCHAR
+STARTCHAR asteriskmath
+ENCODING 8727
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+A0
+70
+E0
+50
+40
+ENDCHAR
+STARTCHAR uni2218
+ENCODING 8728
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+00
+00
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 8729
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR radical
+ENCODING 8730
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+20
+20
+A0
+60
+00
+ENDCHAR
+STARTCHAR uni221B
+ENCODING 8731
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+50
+D0
+10
+50
+30
+ENDCHAR
+STARTCHAR uni221C
+ENCODING 8732
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+D0
+50
+10
+50
+30
+ENDCHAR
+STARTCHAR proportional
+ENCODING 8733
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+E0
+50
+00
+ENDCHAR
+STARTCHAR infinity
+ENCODING 8734
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+D0
+B0
+40
+00
+ENDCHAR
+STARTCHAR orthogonal
+ENCODING 8735
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+80
+80
+E0
+00
+ENDCHAR
+STARTCHAR angle
+ENCODING 8736
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+80
+E0
+00
+ENDCHAR
+STARTCHAR uni2221
+ENCODING 8737
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+A0
+40
+A0
+F0
+20
+ENDCHAR
+STARTCHAR uni2222
+ENCODING 8738
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+60
+A0
+A0
+60
+90
+ENDCHAR
+STARTCHAR uni2223
+ENCODING 8739
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+00
+ENDCHAR
+STARTCHAR uni2224
+ENCODING 8740
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+40
+00
+ENDCHAR
+STARTCHAR uni2225
+ENCODING 8741
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR uni2226
+ENCODING 8742
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+B0
+E0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicaland
+ENCODING 8743
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+A0
+A0
+00
+ENDCHAR
+STARTCHAR logicalor
+ENCODING 8744
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+40
+40
+00
+ENDCHAR
+STARTCHAR intersection
+ENCODING 8745
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+A0
+A0
+00
+ENDCHAR
+STARTCHAR union
+ENCODING 8746
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+A0
+A0
+40
+00
+ENDCHAR
+STARTCHAR integral
+ENCODING 8747
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR uni222C
+ENCODING 8748
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+A0
+A0
+A0
+80
+ENDCHAR
+STARTCHAR uni222D
+ENCODING 8749
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+D0
+D0
+D0
+A0
+ENDCHAR
+STARTCHAR uni222E
+ENCODING 8750
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+E0
+40
+80
+ENDCHAR
+STARTCHAR uni222F
+ENCODING 8751
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+E0
+E0
+A0
+80
+ENDCHAR
+STARTCHAR uni2230
+ENCODING 8752
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+D0
+F0
+F0
+D0
+A0
+ENDCHAR
+STARTCHAR uni2231
+ENCODING 8753
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+50
+40
+80
+ENDCHAR
+STARTCHAR uni2232
+ENCODING 8754
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+C0
+40
+80
+ENDCHAR
+STARTCHAR uni2233
+ENCODING 8755
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+C0
+E0
+40
+80
+ENDCHAR
+STARTCHAR therefore
+ENCODING 8756
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2235
+ENCODING 8757
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2236
+ENCODING 8758
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2237
+ENCODING 8759
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni2238
+ENCODING 8760
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2239
+ENCODING 8761
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+20
+C0
+20
+00
+ENDCHAR
+STARTCHAR uni223A
+ENCODING 8762
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+00
+E0
+00
+A0
+00
+ENDCHAR
+STARTCHAR uni223B
+ENCODING 8763
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+00
+50
+A0
+00
+40
+ENDCHAR
+STARTCHAR similar
+ENCODING 8764
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni223D
+ENCODING 8765
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni223E
+ENCODING 8766
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+D0
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni223F
+ENCODING 8767
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+50
+A0
+20
+00
+ENDCHAR
+STARTCHAR uni2240
+ENCODING 8768
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+20
+40
+40
+20
+00
+ENDCHAR
+STARTCHAR uni2241
+ENCODING 8769
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+B0
+D0
+40
+80
+ENDCHAR
+STARTCHAR uni2242
+ENCODING 8770
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+00
+A0
+50
+00
+ENDCHAR
+STARTCHAR uni2243
+ENCODING 8771
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2244
+ENCODING 8772
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+D0
+B0
+40
+F0
+40
+ENDCHAR
+STARTCHAR congruent
+ENCODING 8773
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni2246
+ENCODING 8774
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR uni2247
+ENCODING 8775
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+20
+F0
+40
+F0
+ENDCHAR
+STARTCHAR approxequal
+ENCODING 8776
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+50
+A0
+00
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni2249
+ENCODING 8777
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+A0
+40
+50
+E0
+80
+ENDCHAR
+STARTCHAR uni224A
+ENCODING 8778
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+00
+F0
+ENDCHAR
+STARTCHAR uni224B
+ENCODING 8779
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+B0
+40
+B0
+40
+B0
+ENDCHAR
+STARTCHAR uni224C
+ENCODING 8780
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+50
+00
+E0
+00
+E0
+ENDCHAR
+STARTCHAR uni224D
+ENCODING 8781
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+00
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni224E
+ENCODING 8782
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+A0
+40
+00
+ENDCHAR
+STARTCHAR uni224F
+ENCODING 8783
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+A0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2250
+ENCODING 8784
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2251
+ENCODING 8785
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+40
+ENDCHAR
+STARTCHAR uni2252
+ENCODING 8786
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+00
+E0
+00
+20
+ENDCHAR
+STARTCHAR uni2253
+ENCODING 8787
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+00
+E0
+00
+80
+ENDCHAR
+STARTCHAR uni2254
+ENCODING 8788
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+B0
+00
+B0
+00
+00
+ENDCHAR
+STARTCHAR uni2255
+ENCODING 8789
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+D0
+00
+D0
+00
+00
+ENDCHAR
+STARTCHAR uni2256
+ENCODING 8790
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+E0
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2257
+ENCODING 8791
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2258
+ENCODING 8792
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2259
+ENCODING 8793
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225A
+ENCODING 8794
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225B
+ENCODING 8795
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225C
+ENCODING 8796
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+00
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni225D
+ENCODING 8797
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225E
+ENCODING 8798
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni225F
+ENCODING 8799
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR notequal
+ENCODING 8800
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR equivalence
+ENCODING 8801
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2262
+ENCODING 8802
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+20
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2263
+ENCODING 8803
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+00
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR lessequal
+ENCODING 8804
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR greaterequal
+ENCODING 8805
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2266
+ENCODING 8806
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2267
+ENCODING 8807
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2268
+ENCODING 8808
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni2269
+ENCODING 8809
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+40
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni226A
+ENCODING 8810
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+50
+A0
+50
+00
+00
+ENDCHAR
+STARTCHAR uni226B
+ENCODING 8811
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+50
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni226C
+ENCODING 8812
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+40
+A0
+40
+A0
+00
+ENDCHAR
+STARTCHAR uni226D
+ENCODING 8813
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+E0
+40
+E0
+80
+00
+ENDCHAR
+STARTCHAR uni226E
+ENCODING 8814
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+60
+C0
+60
+80
+00
+ENDCHAR
+STARTCHAR uni226F
+ENCODING 8815
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+60
+C0
+80
+00
+ENDCHAR
+STARTCHAR uni2270
+ENCODING 8816
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2271
+ENCODING 8817
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+60
+E0
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2272
+ENCODING 8818
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+E0
+00
+50
+A0
+ENDCHAR
+STARTCHAR uni2273
+ENCODING 8819
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+E0
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2276
+ENCODING 8822
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+20
+80
+60
+C0
+ENDCHAR
+STARTCHAR uni2277
+ENCODING 8823
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+80
+20
+C0
+60
+ENDCHAR
+STARTCHAR uni2278
+ENCODING 8824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+C0
+60
+C0
+60
+C0
+ENDCHAR
+STARTCHAR uni2279
+ENCODING 8825
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+60
+C0
+60
+ENDCHAR
+STARTCHAR uni227A
+ENCODING 8826
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+20
+C0
+20
+00
+00
+ENDCHAR
+STARTCHAR uni227B
+ENCODING 8827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+80
+60
+80
+00
+00
+ENDCHAR
+STARTCHAR uni227C
+ENCODING 8828
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227D
+ENCODING 8829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+60
+80
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni227E
+ENCODING 8830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni227F
+ENCODING 8831
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+C0
+20
+00
+A0
+50
+ENDCHAR
+STARTCHAR uni2280
+ENCODING 8832
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2281
+ENCODING 8833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR propersubset
+ENCODING 8834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+80
+60
+00
+00
+ENDCHAR
+STARTCHAR propersuperset
+ENCODING 8835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+C0
+20
+C0
+00
+00
+ENDCHAR
+STARTCHAR notsubset
+ENCODING 8836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+C0
+60
+40
+00
+ENDCHAR
+STARTCHAR uni2285
+ENCODING 8837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+C0
+60
+C0
+40
+00
+ENDCHAR
+STARTCHAR reflexsubset
+ENCODING 8838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+00
+E0
+00
+ENDCHAR
+STARTCHAR reflexsuperset
+ENCODING 8839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+00
+E0
+00
+ENDCHAR
+STARTCHAR uni2288
+ENCODING 8840
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+A0
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni2289
+ENCODING 8841
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+60
+C0
+40
+E0
+40
+ENDCHAR
+STARTCHAR uni228A
+ENCODING 8842
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+80
+60
+40
+E0
+80
+ENDCHAR
+STARTCHAR uni228B
+ENCODING 8843
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+20
+C0
+40
+E0
+80
+ENDCHAR
+STARTCHAR revlogicalnot
+ENCODING 8976
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+80
+00
+00
+ENDCHAR
+STARTCHAR integraltp
+ENCODING 8992
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR integralbt
+ENCODING 8993
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+20
+20
+20
+20
+20
+40
+ENDCHAR
+STARTCHAR uni23BA
+ENCODING 9146
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BB
+ENCODING 9147
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F0
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni23BC
+ENCODING 9148
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni23BD
+ENCODING 9149
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2409
+ENCODING 9225
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240A
+ENCODING 9226
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+60
+40
+40
+ENDCHAR
+STARTCHAR uni240B
+ENCODING 9227
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+A0
+40
+70
+20
+20
+ENDCHAR
+STARTCHAR uni240C
+ENCODING 9228
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+80
+60
+60
+40
+ENDCHAR
+STARTCHAR uni240D
+ENCODING 9229
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+80
+E0
+50
+60
+50
+ENDCHAR
+STARTCHAR uni2423
+ENCODING 9251
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+90
+F0
+ENDCHAR
+STARTCHAR uni2424
+ENCODING 9252
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+D0
+B0
+90
+20
+20
+30
+ENDCHAR
+STARTCHAR SF100000
+ENCODING 9472
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2501
+ENCODING 9473
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+00
+00
+ENDCHAR
+STARTCHAR SF110000
+ENCODING 9474
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2503
+ENCODING 9475
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR uni2504
+ENCODING 9476
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2505
+ENCODING 9477
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni2506
+ENCODING 9478
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni2507
+ENCODING 9479
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR uni2508
+ENCODING 9480
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni2509
+ENCODING 9481
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A8
+A8
+00
+00
+ENDCHAR
+STARTCHAR uni250A
+ENCODING 9482
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+00
+40
+00
+40
+00
+ENDCHAR
+STARTCHAR uni250B
+ENCODING 9483
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+00
+60
+00
+60
+00
+ENDCHAR
+STARTCHAR SF010000
+ENCODING 9484
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250D
+ENCODING 9485
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni250E
+ENCODING 9486
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR uni250F
+ENCODING 9487
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF030000
+ENCODING 9488
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2511
+ENCODING 9489
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2512
+ENCODING 9490
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2513
+ENCODING 9491
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF020000
+ENCODING 9492
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2515
+ENCODING 9493
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2516
+ENCODING 9494
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2517
+ENCODING 9495
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR SF040000
+ENCODING 9496
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2519
+ENCODING 9497
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni251A
+ENCODING 9498
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR uni251B
+ENCODING 9499
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF080000
+ENCODING 9500
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251D
+ENCODING 9501
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251E
+ENCODING 9502
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+40
+40
+ENDCHAR
+STARTCHAR uni251F
+ENCODING 9503
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2520
+ENCODING 9504
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2521
+ENCODING 9505
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+40
+40
+ENDCHAR
+STARTCHAR uni2522
+ENCODING 9506
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR uni2523
+ENCODING 9507
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+70
+60
+60
+ENDCHAR
+STARTCHAR SF090000
+ENCODING 9508
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2525
+ENCODING 9509
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR uni2526
+ENCODING 9510
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni2527
+ENCODING 9511
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2528
+ENCODING 9512
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni2529
+ENCODING 9513
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+40
+40
+ENDCHAR
+STARTCHAR uni252A
+ENCODING 9514
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR uni252B
+ENCODING 9515
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF060000
+ENCODING 9516
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252D
+ENCODING 9517
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252E
+ENCODING 9518
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni252F
+ENCODING 9519
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2530
+ENCODING 9520
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2531
+ENCODING 9521
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2532
+ENCODING 9522
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2533
+ENCODING 9523
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF070000
+ENCODING 9524
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2535
+ENCODING 9525
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2536
+ENCODING 9526
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2537
+ENCODING 9527
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2538
+ENCODING 9528
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni2539
+ENCODING 9529
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253A
+ENCODING 9530
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni253B
+ENCODING 9531
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF050000
+ENCODING 9532
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253D
+ENCODING 9533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253E
+ENCODING 9534
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni253F
+ENCODING 9535
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2540
+ENCODING 9536
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2541
+ENCODING 9537
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2542
+ENCODING 9538
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2543
+ENCODING 9539
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2544
+ENCODING 9540
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2545
+ENCODING 9541
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2546
+ENCODING 9542
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2547
+ENCODING 9543
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+40
+40
+ENDCHAR
+STARTCHAR uni2548
+ENCODING 9544
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni2549
+ENCODING 9545
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254A
+ENCODING 9546
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254B
+ENCODING 9547
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+F0
+60
+60
+ENDCHAR
+STARTCHAR uni254C
+ENCODING 9548
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254D
+ENCODING 9549
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+A0
+A0
+00
+00
+ENDCHAR
+STARTCHAR uni254E
+ENCODING 9550
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+40
+00
+40
+40
+ENDCHAR
+STARTCHAR uni254F
+ENCODING 9551
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR SF430000
+ENCODING 9552
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF240000
+ENCODING 9553
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR SF510000
+ENCODING 9554
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF520000
+ENCODING 9555
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+60
+60
+ENDCHAR
+STARTCHAR SF390000
+ENCODING 9556
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF220000
+ENCODING 9557
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF210000
+ENCODING 9558
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF250000
+ENCODING 9559
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF500000
+ENCODING 9560
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF490000
+ENCODING 9561
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+00
+00
+ENDCHAR
+STARTCHAR SF380000
+ENCODING 9562
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+00
+ENDCHAR
+STARTCHAR SF280000
+ENCODING 9563
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+00
+ENDCHAR
+STARTCHAR SF270000
+ENCODING 9564
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+00
+00
+ENDCHAR
+STARTCHAR SF260000
+ENCODING 9565
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+00
+ENDCHAR
+STARTCHAR SF360000
+ENCODING 9566
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+70
+40
+70
+40
+ENDCHAR
+STARTCHAR SF370000
+ENCODING 9567
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+70
+60
+60
+ENDCHAR
+STARTCHAR SF420000
+ENCODING 9568
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+70
+40
+70
+60
+ENDCHAR
+STARTCHAR SF190000
+ENCODING 9569
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+C0
+40
+C0
+40
+ENDCHAR
+STARTCHAR SF200000
+ENCODING 9570
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+E0
+60
+60
+ENDCHAR
+STARTCHAR SF230000
+ENCODING 9571
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+E0
+20
+E0
+60
+ENDCHAR
+STARTCHAR SF470000
+ENCODING 9572
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+40
+ENDCHAR
+STARTCHAR SF480000
+ENCODING 9573
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF410000
+ENCODING 9574
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR SF450000
+ENCODING 9575
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF460000
+ENCODING 9576
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+00
+00
+ENDCHAR
+STARTCHAR SF400000
+ENCODING 9577
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+00
+ENDCHAR
+STARTCHAR SF540000
+ENCODING 9578
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+F0
+40
+F0
+40
+ENDCHAR
+STARTCHAR SF530000
+ENCODING 9579
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+F0
+60
+60
+ENDCHAR
+STARTCHAR SF440000
+ENCODING 9580
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+F0
+00
+F0
+60
+ENDCHAR
+STARTCHAR uni256D
+ENCODING 9581
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+30
+40
+40
+ENDCHAR
+STARTCHAR uni256E
+ENCODING 9582
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+80
+40
+40
+ENDCHAR
+STARTCHAR uni256F
+ENCODING 9583
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+80
+00
+00
+ENDCHAR
+STARTCHAR uni2570
+ENCODING 9584
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+30
+00
+00
+ENDCHAR
+STARTCHAR uni2571
+ENCODING 9585
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+20
+20
+40
+40
+80
+ENDCHAR
+STARTCHAR uni2572
+ENCODING 9586
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+40
+40
+20
+20
+10
+ENDCHAR
+STARTCHAR uni2573
+ENCODING 9587
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+90
+90
+60
+60
+90
+90
+ENDCHAR
+STARTCHAR uni2574
+ENCODING 9588
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2575
+ENCODING 9589
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2576
+ENCODING 9590
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+70
+00
+00
+ENDCHAR
+STARTCHAR uni2577
+ENCODING 9591
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+40
+40
+40
+ENDCHAR
+STARTCHAR uni2578
+ENCODING 9592
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+C0
+00
+00
+ENDCHAR
+STARTCHAR uni2579
+ENCODING 9593
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+00
+00
+ENDCHAR
+STARTCHAR uni257A
+ENCODING 9594
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+70
+70
+00
+00
+ENDCHAR
+STARTCHAR uni257B
+ENCODING 9595
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257C
+ENCODING 9596
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+30
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257D
+ENCODING 9597
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+60
+60
+60
+ENDCHAR
+STARTCHAR uni257E
+ENCODING 9598
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+C0
+F0
+00
+00
+ENDCHAR
+STARTCHAR uni257F
+ENCODING 9599
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+60
+60
+60
+60
+40
+40
+ENDCHAR
+STARTCHAR upblock
+ENCODING 9600
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2581
+ENCODING 9601
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F0
+ENDCHAR
+STARTCHAR uni2582
+ENCODING 9602
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+00
+F8
+ENDCHAR
+STARTCHAR uni2583
+ENCODING 9603
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+00
+F8
+F8
+ENDCHAR
+STARTCHAR dnblock
+ENCODING 9604
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2585
+ENCODING 9605
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+00
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2586
+ENCODING 9606
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2587
+ENCODING 9607
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR block
+ENCODING 9608
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR uni2589
+ENCODING 9609
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+F0
+F0
+F0
+F0
+F0
+ENDCHAR
+STARTCHAR uni258A
+ENCODING 9610
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR uni258B
+ENCODING 9611
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+E0
+E0
+E0
+E0
+E0
+E0
+ENDCHAR
+STARTCHAR lfblock
+ENCODING 9612
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258D
+ENCODING 9613
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR uni258E
+ENCODING 9614
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR uni258F
+ENCODING 9615
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR rtblock
+ENCODING 9616
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+30
+30
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR ltshade
+ENCODING 9617
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+20
+80
+20
+80
+20
+ENDCHAR
+STARTCHAR shade
+ENCODING 9618
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A8
+50
+A8
+50
+A8
+50
+ENDCHAR
+STARTCHAR dkshade
+ENCODING 9619
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+B8
+E8
+B8
+E8
+B8
+E8
+ENDCHAR
+STARTCHAR uni2594
+ENCODING 9620
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F8
+00
+00
+00
+00
+00
+ENDCHAR
+STARTCHAR uni2595
+ENCODING 9621
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR filledbox
+ENCODING 9632
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+E0
+E0
+00
+ENDCHAR
+STARTCHAR H22073
+ENCODING 9633
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+00
+E0
+A0
+E0
+00
+ENDCHAR
+STARTCHAR uni25C6
+ENCODING 9670
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR spade
+ENCODING 9824
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+E0
+E0
+40
+E0
+00
+ENDCHAR
+STARTCHAR club
+ENCODING 9827
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+A0
+40
+E0
+00
+ENDCHAR
+STARTCHAR heart
+ENCODING 9829
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+A0
+E0
+E0
+40
+00
+ENDCHAR
+STARTCHAR diamond
+ENCODING 9830
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+00
+40
+E0
+40
+00
+00
+ENDCHAR
+STARTCHAR uni2669
+ENCODING 9833
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+40
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnote
+ENCODING 9834
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+40
+60
+40
+C0
+80
+00
+ENDCHAR
+STARTCHAR musicalnotedbl
+ENCODING 9835
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+50
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266C
+ENCODING 9836
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+70
+70
+50
+50
+A0
+00
+ENDCHAR
+STARTCHAR uni266D
+ENCODING 9837
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+80
+E0
+A0
+C0
+00
+ENDCHAR
+STARTCHAR uni266E
+ENCODING 9838
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+80
+E0
+A0
+E0
+20
+00
+ENDCHAR
+STARTCHAR uni266F
+ENCODING 9839
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+A0
+E0
+A0
+E0
+A0
+00
+ENDCHAR
+STARTCHAR uniFFFD
+ENCODING 65533
+SWIDTH 640 0
+DWIDTH 4 0
+BBX 4 6 0 -1
+BITMAP
+F0
+90
+D0
+F0
+D0
+F0
+ENDCHAR
+ENDFONT
diff --git a/src/col64/cruft/coltbl.pl b/src/col64/cruft/coltbl.pl
new file mode 100644
index 0000000..e933437
--- /dev/null
+++ b/src/col64/cruft/coltbl.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+for(0..63) {
+ $pix = $_*5;
+ $byte = int($pix/8);
+ $mask = 0xf800;
+ $offs = $pix % 8;
+ $mask >>= $offs;
+ $mask = (~$mask) & 0xffff;
+ $mleft = sprintf "%02X", $mask >> 8;
+ $mright = sprintf "%02X", $mask & 0xff;
+ $m = sprintf("%016b", $mask);
+ printf "\$%02X, ", $offs;
+# print <<EOF;
+#$_ $pix $byte $offs $mleft $mright $m
+#EOF
+}
diff --git a/src/col64/equates.inc b/src/col64/equates.inc
new file mode 100644
index 0000000..9759a8a
--- /dev/null
+++ b/src/col64/equates.inc
@@ -0,0 +1,1386 @@
+;
+; ATARI 800 EQUATE LISTING
+;
+; (version 20070530_bkw)
+;
+; This is a heavily modified copy of Appendix A of the Atari System
+; Reference Manual (with much info added from Appendix B, and from
+; Mapping the Atari and other sources)
+;
+;
+;This listing is based on the original release of Operating System,
+;version A. The vectors shown here were not changed in version B.
+;New equates for XL and XE models are included and noted. Changes
+;from version B to XL/XE are also noted.
+;
+;Most of the equate names given below are the official Atari
+;names. They are in common use but are not mandatory.
+
+; This file can be included in your assembly source, but it's also
+; got a lot of useful human-readable comments. It's meant to serve as
+; a "quick reference" to Atari programmers, particularly ones who use
+; a cross-assembler on a UNIX-ish platform and a text editor that can
+; use "ctags":
+
+; $ ctags equates.inc
+; $ vim mystuff.dasm
+
+; While in vim, press ^] (control-right-bracket) while sitting on a label,
+; to jump to that label's definition in this file. (Also, you can type
+; :tag labelname). You can also do completion on the labels in vim by
+; typing part of a label and pressing ^N (or Tab, if you use the
+; CleverTab script from vimhelp.org)
+
+; GNU Emacs and XEmacs also support ctags, but I've never used them, so
+; I dunno how to do it. I do know that you need to use "Exuberant" ctags,
+; not the ctags that comes with emacs (which doesn't grok 6502 asm).
+
+; If you're using an Atari assembler instead of a cross-assembler, you
+; don't want to use this as-is: all the extra comments make it huge, and
+; it'll be either too large for the Atari's memory, or at least will take
+; a long time to assemble. You can make a comment-less, Atari-compatible
+; version like so:
+
+; perl -lne 's/;.*//; s/\s*$//; print if $_' < equates.inc > small.inc
+
+; ...then use a8eol to convert it to ATASCII format.
+
+; 20061028 bkw: Originally downloaded from:
+
+; http://atrey.karlin.mff.cuni.cz/~pavel/atari/atrb.html
+
+; ...and converted to DASM/ATASM/CA65 format. dasm, atasm, and ca65 use
+; similar enough syntax that this file can be used as-is with any of
+; them. Unfortunately, this means I can't do conditional assembly in this
+; file, since the two assemblers use different semantics... macros are
+; even less compatible :(
+
+; If you use ca65, you need this line in your source:
+
+;; .FEATURE labels_without_colons
+
+; before including this file, or else run ca65 with
+; "--feature labels_without_colons").
+
+; 20070529 bkw: updated, added missing GTIA/POKEY/ANTIC equates,
+; documented where the shadows are for those GTIA/POKEY/ANTIC/PIA
+; registers that have them. Also added a list of error messages and
+; explanation of the cassette buffer layout, and organized the C_*
+; CIO constants. Made minor modifications to get this file to assemble
+; with ATasm as well as DASM.
+
+; I have added a few missing equates: this file only
+; contained OS ROM locations when I got it.
+; I added a few from FMS/DOS as well (e.g. RUNAD and INITAD).
+
+; XL-specific locations in the original file were duplicate labels
+; (e.g. PTIMOT was defined as both $1C and $314), which keeps DASM
+; from being able to assemble the file. I prefixed the XL/XL versions
+; with "XL_"
+
+; Also, I've prefixed the CIO command and AUX1 constants with C_, since some
+; of them conflicted with other labels in the original version.
+
+; Areas listed as "unmapped" are literally not connected to anything.
+; Trying to read from unmapped address space results in reading whatever
+; garbage was on the data bus when the read happened. On my 1200XL, this
+; generally results in all 1's ($FF or 255).
+; In a 400, 600XL or other Atari with less than 48K of RAM, the missing
+; RAM address space is also unmapped.
+
+; Still TODO:
+; - Rest of the DOS/FMS equates
+; - Mark 800-ony locations with OSB_
+; - ifdef code, so the user can set the machine type (OSB or XL),
+; then refer to e.g. PTIMOT and get either OSB_PTIMOT or XL_PTIMOT
+; - Split into separate files? I'd rather not (it's only about 1000 lines)
+
+; This file's mostly intended for new development. It could also be
+; useful for porting old ASM/ED or Mac65 code to DASM, but such code
+; may need work... you can always assemble it with ATasm, in that case,
+; since it's 99.999% source code compatible with Mac65.
+
+; References to "APPENDIX C" and such are referring to the Atari System
+; Reference Manual, a version of which can be found at:
+
+; http://atrey.karlin.mff.cuni.cz/~pavel/atari/atrtblc.html
+
+; References to "Mapping" refer to "Mapping the Atari, Revised Edition",
+; which can be found at:
+
+; http://www.atariarchives.org/mapping/index.php
+
+; I've pasted a few quotes from Mapping into this file; I consider them
+; small enough to be covered under the "fair use" provisions of copyright law
+; (I am not a lawyer, though).
+
+;
+;
+; DEVICE NAMES
+;
+;
+;SCREDT = "E" SCREEN EDITOR
+;KBD = "K" KEYBOARD
+;DISPLY = "S" DISPLAY
+;PRINTR = "P" PRINTER
+;CASSET = "C" CASSETTE
+;DISK = "D" DISK DRIVE
+;
+;
+;
+; STATUS CODES
+;
+;
+
+; 20070529 bkw: These are returned as error codes, though various DOSes
+; also define their own codes (usually in the range 160-255).
+; Errors 2-21 are defined by BASIC.
+; Errors 150-154 are defined by the R: (850 or compatible, RS-232) handler.
+SUCCES = $01 ; 1
+BRKABT = $80 ; 128 BREAK KEY ABORT
+PRVOPN = $82 ; 130 IOCB ALREADY OPEN
+NONDEV = $82 ; 130 NONEXISTANT DEVICE
+WRONLY = $83 ; 131 OPENED FOR WRITE ONLY
+NVALID = $84 ; 132 INVALID COMMAND
+NOTOPN = $85 ; 133 DEVICE OR FILE NOT OPEN
+BADIOC = $86 ; 134 INVALID IOCB NUMBER
+RDONLY = $87 ; 135 OPENED FOR READ ONLY
+EOFERR = $88 ; 136 END OF FILE
+TRNRCD = $89 ; 137 TRUNCATED RECORD
+TIMOUT = $8A ; 138 PERIPHERAL TIME OUT
+DNACK = $8B ; 139 DEVICE DOES NOT ACKNOWLEDGE
+FRMERR = $8C ; 140 SERIAL BUS FRAMING ERROR
+CRSROR = $8D ; 141 CURSOR OUT OF RANGE
+OVRRUN = $8E ; 142 SERIAL BUS DATA OVERRUN
+CHKERR = $8F ; 143 SERIAL BUS CHECKSUM ERROR
+DERROR = $90 ; 144 PERIPHERAL DEVICE ERROR
+BADMOD = $91 ; 145 NON EXISTANT SCREEN MODE
+FNCNOT = $92 ; 146 FUNCTION NOT IMPLEMENTED
+SCRMEM = $93 ; 147 NOT ENOUGH MEMORY FOR SCREEN MODE
+
+; BASIC error codes (also used by e.g. Basic XL/XE and Turbo BASIC):
+;; 2: Insufficient Memory
+;; 3: Value Error
+;; 4: Too Many Variables
+;; 5: String Length Error
+;; 6: Out of Data Error
+;; 7: Number Greater than 32767
+;; 8: Input Statement Error
+;; 9: Array or String DIM Error
+;; 10: Argument Stack Overflow
+;; 11: Floating Point Overflow or Underflow Error
+;; 12: Line Not Found
+;; 13: No Matching FOR Statement
+;; 14: Line Too Long
+;; 15: GOSUB or FOR Line Deleted
+;; 16: RETURN Error
+;; 17: Garbage Error
+;; 18: Invalid String Character
+;; 19: LOAD Program Too Long
+;; 20: Bad Channel Number
+;; 21: LOAD File Error
+
+; 850/R: error codes:
+;; 150: Serial Port Already Open
+;; 151: Concurrent Mode Not Enabled
+;; 152: Illegal User-Supplied Buffer
+;; 153: Active Concurrent Mode Error
+;; 154: Concurrent Mode Not Active
+
+; DOS error codes (DOS 2.0S only; other DOSes may define other errors)
+;; 160: Device Number Error
+;; 161: Too Many OPEN Files
+;; 162: Disk Full
+;; 163: Fatal System Error
+;; 164: File Number Mismatch
+;; 165: Bad File Name
+;; 166: POINT Data Length Error
+;; 167: File Locked
+;; 168: Invalid XIO Command
+;; 169: Directory Full
+;; 170: File Not Found
+;; 171: POINT Invalid
+;; 172: DOS 1 File
+;; 173: Bad Sector
+;; 255: FORMATTING Error (DOS 2.5)
+
+;
+;
+;
+;
+; COMMAND CODES FOR CIO
+;
+;
+
+; Command byte goes in ICCOM,x
+
+;; General-purpose commands:
+C_OPEN = $03 ; 3 OPEN (BASIC OPEN)
+C_GETREC = $05 ; 5 GET RECORD
+C_GETCHR = $07 ; 7 GET BYTE
+C_PUTREC = $09 ; 9 WRITE RECORD
+C_PUTCHR = $0B ; 11 PUT-BYTE
+C_CLOSE = $0C ; 12
+C_STATUS = $0D ; 13
+C_SPECIL = $0E ; 14 BEGINNING OF SPECIAL COMMANDS (aka XIO)
+;; Commands for S: device:
+C_DRAWLN = $11 ; 17 SCREEN DRAW (BASIC DRAWTO)
+C_FILLIN = $12 ; 18 SCREEN FILL
+;; Commands for D: device (only when DOS is loaded):
+C_RENAME = $20 ; 32
+C_DELETE = $21 ; 33
+C_LOCK = $23 ; 35
+C_UNLOCK = $24 ; 36
+C_POINT = $25 ; 37
+C_NOTE = $26 ; 38
+
+; AUX1 modes (ICAX1,x or 2nd parameter of BASIC OPEN command):
+C_OPREAD = $04 ; 4 OPEN FOR INPUT
+C_OWRITE = $08 ; 8 OPEN FOR OUTPUT
+C_APPEND = $09 ; 9 OPEN TO APPEND TO END OF DISK FILE
+C_OUPDAT = $0C ; 12 OPEN FOR INPUT AND OUTPUT AT THE SAME TIME
+;; D: (DOS) only:
+C_OPDIR = $06 ; 6 OPEN TO DISK DIRECTORY
+;; S: only:
+C_MXDMOD = $10 ; 16 OPEN TO SPLIT SCREEN (MIXED MODE)
+C_INSCLR = $20 ; 32 OPEN TO SCREEN BUT DON'T ERASE
+;; C: only:
+C_NOIRG = $80 ; 128 NO GAP CASSETTE MODE
+
+;; Command bytes (ICCOM) for the RS-232 (R:) device:
+;;
+;; Output partial block 32 $20
+;; Control RTS,XMT,DTR 34 $22
+;; Baud, stop bits, word size 36 $24
+;; Translation mode 38 $26
+;; Concurrent mode 40 $28
+;;
+;; (see the 850 Interface Manual for details)
+
+
+; SIO command bytes (not part of CIO):
+S_DFRMAT = $21 ; 33 FORMAT DISK (RESIDENT DISK HANDLER (RDH))
+S_PTSECT = $50 ; 80 RDH PUT SECTOR
+S_GTSECT = $52 ; 82 RDH GET SECTOR
+S_DSTAT = $53 ; 83 RDH GET STATUS
+S_PSECTV = $57 ; 87 RDH PUT SECTOR AND VERIFY
+; Various other SIO commands are supported by different drives
+
+; 20061028 bkw: CR/EOL not really part of CIO, but useful:
+CR = $9B ; 155 CARRIAGE RETURN (EOL)
+EOL = CR ; defined in SYSEQU.ASM
+
+;
+IOCBSZ = $10 ; 16 IOCB SIZE
+MAXIOC = $80 ; 128 MAX IOCB BLOCK SIZE
+IOCBF = $FF ; 255 IOCB FREE
+;
+LEDGE = $02 ; 2 DEFAULT LEFT MARGIN
+REDGE = $27 ; 39 DEFAULT RIGHT MARGIN
+
+; OS VARIABLES
+;
+; PAGE 0
+;
+LINZBS = $00 ; 0 (800) FOR ORIGINAL DEBUGGER
+; $00 0 (XL) RESERVED
+NGFLAG = $01 ; 1 (XL) FOR POWER-UP SELF TEST
+CASINI = $02 ; 2
+RAMLO = $04 ; 4 POINTER FOR SELF TEST
+TRAMSZ = $06 ; 6 TEMPORARY RAM SIZE
+TSTDAT = $07 ; 7 TEST DATA
+WARMST = $08 ; 8
+BOOTQ = $09 ; 9 SUCCESSFUL BOOT FLAG
+; aka BOOT? in the OS source, but some assemblers don't support ? in labels
+DOSVEC = $0A ; 10 PROGRAM RUN VECTOR
+DOSINI = $0C ; 12 PROGRAM INITIALIZATION
+APPMHI = $0E ; 14 DISPLAY LOW LIMIT
+POKMSK = $10 ; 16 IRQ ENABLE FLAGS (shadow for IRQEN)
+BRKKEY = $11 ; 17 FLAG
+RTCLOK = $12 ; 18 3 BYTES, MSB FIRST
+BUFADR = $15 ; 21 INDIRECT BUFFER ADDRESS
+ICCOMT = $17 ; 23 COMMAND FOR VECTOR
+DSKFMS = $18 ; 24 DISK FILE MANAGER POINTER
+DSKUTL = $1A ; 26 DISK UTILITY POINTER (DUP.SYS)
+PTIMOT = $1C ; 28 (800) PRINTER TIME OUT REGISTER
+ABUFPT = $1C ; 28 (XL) RESERVED
+PBPNT = $1D ; 29 (800) PRINTER BUFFER POINTER
+; $1D ; 29 (XL) RESERVED
+PBUFSZ = $1E ; 30 (800) PRINTER BUFFER SIZE
+; $1E ; 30 (XL) RESERVED
+PTEMP = $1F ; 31 (800) TEMPORARY REGISTER (PTEMP deleted in XL OS)
+; $1F ; 31 (XL) RESERVED
+ZIOCB = $20 ; 32 ZERO PAGE IOCB
+ICHIDZ = $20 ; 32 HANDLER INDEX NUMBER (ID)
+ICDNOZ = $21 ; 33 DEVICE NUMBER
+ICCOMZ = $22 ; 34 COMMAND
+ICSTAZ = $23 ; 35 STATUS
+ICBALZ = $24 ; 36 BUFFER POINTER LOW BYTE
+ICBAHZ = $25 ; 37 BUFFER POINTER HIGH BYTE
+ICPTLZ = $26 ; 38 PUT ROUTINE POINTER LOW
+ICPTHZ = $27 ; 39 PUT ROUTINE POINTER HIGH
+ICBLLZ = $28 ; 40 BUFFER LENGTH LOW
+ICBLHZ = $29 ; 41
+ICAX1Z = $2A ; 42 AUXILIARY INFORMATION BYTE 1
+ICAX2Z = $2B ; 43
+ICSPRZ = $2C ; 44 TWO SPARE BYTES (CIO USE)
+ICIDNO = $2E ; 46 IOCB NUMBER X 16
+CIOCHR = $2F ; 47 CHARACTER BYTE FOR CURRENT OPERATION
+;
+STATUS = $30 ; 48 STATUS STORAGE
+CHKSUM = $31 ; 49 SUM WITH CARRY ADDED BACK
+BUFRLO = $32 ; 50 DATA BUFFER LOW BYTE
+BUFRHI = $33 ; 51
+BFENLO = $34 ; 52 ADDRESS OF LAST BUFFER BYTE +1 (LOW)
+BFENHI = $35 ; 53
+CRETRY = $36 ; 54 (800) NUMBER OF COMMAND FRAME RETRIES
+XL_LTEMP = $36 ; 54 (XL) LOADER TEMPORARY STORAGE, 2 BYTES
+DRETRY = $37 ; 55 (800) DEVICE RETRIES
+BUFRFL = $38 ; 56 BUFFER FULL FLAG
+RECVDN = $39 ; 57 RECEIVE DONE FLAG
+XMTDON = $3A ; 58 TRANSMISSION DONE FLAG
+CHKSNT = $3B ; 59 CHECKSUM-SENT FLAG
+NOCKSM = $3C ; 60 CHECKSUM-DOES-NOT-FOLLOW-DATA FLAG
+BPTR = $3D ; 61
+FTYPE = $3E ; 62
+FEOF = $3F ; 63
+FREQ = $40 ; 64
+;
+SOUNDR = $41 ; 65 0=QUIET I/O
+CRITIC = $42 ; 66 CRITICAL FUNCTION FLAG, NO DEFFERED VBI
+FMSZPG = $43 ; 67 DOS ZERO PAGE, 7 BYTES
+CKEY = $4A ; 74 (800) START KEY FLAG
+XL_ZCHAIN = $4A ; 74 (XL) HANDLER LOADER TEMP, 2 BYTES
+CASSBT = $4B ; 75 (800) CASSETTE BOOT FLAG
+DSTAT = $4C ; 76 DISPLAY STATUS
+;
+ATRACT = $4D ; 77
+DRKMSK = $4E ; 78 ATTRACT MASK
+COLRSH = $4F ; 79 ATTRACT COLOR SHIFTER (EORed WITH GRAPHICS)
+;
+TMPCHR = $50 ; 80
+HOLD1 = $51 ; 81
+LMARGN = $52 ; 82 SCREEN LEFT MARGIN REGISTER
+RMARGN = $53 ; 83 SCREEN RIGHT MARGIN
+ROWCRS = $54 ; 84 CURSOR ROW
+COLCRS = $55 ; 85 CURSOR COLUMN, 2 BYTES
+DINDEX = $57 ; 87 DISPLAY MODE
+SAVMSC = $58 ; 88 SCREEN ADDRESS
+OLDROW = $5A ; 90 CURSOR BEFORE DRAW OR FILL
+OLDCOL = $5B ; 91
+OLDCHR = $5D ; 93 DATA UNDER CURSOR
+OLDADR = $5E ; 94 CURSOR ADDRESS
+XL_FKDEF = $60 ; 96 (XL) FUNCTION KEY DEFINITION POINTER (LSB/MSB)
+NEWROW = $60 ; 96 (800) DRAWTO DESTINATION
+NEWCOL = $61 ; 97 (800) DRAWTO DESTINATION, 2 BYTES
+XL_PALNTS = $62 ; 98 (XL) EUROPE/NORTH AMERICA TV FLAG
+LOGCOL = $63 ; 99 LOGICAL LINE COLUMN POINTER
+MLTTMP = $66 ; 102
+OPNTMP = $66 ; 102 TEMPORARY STORAGE FOR CHANNEL OPEN
+SAVADR = $68 ; 104
+RAMTOP = $6A ; 106 START OF ROM (END OF RAM + 1), HIGH BYTE ONLY
+BUFCNT = $6B ; 107 BUFFER COUNT
+BUFSTR = $6C ; 108 POINTER USED BY EDITOR
+BITMSK = $6E ; 110 POINTER USED BY EDITOR
+SHFAMT = $6F ; 111
+ROWAC = $70 ; 112
+COLAC = $72 ; 114
+ENDPT = $74 ; 116
+DELTAR = $76 ; 118
+DELTAC = $77 ; 119
+ROWINC = $79 ; 121 (800)
+XL_KEYDEF = $79 ; 121 (XL) KEY DEFINITION POINTER, 2 BYTES
+COLINC = $7A ; 122 (800)
+SWPFLG = $7B ; 123 NON 0 IF TEXT AND REGULAR RAM IS SWAPPED
+HOLDCH = $7C ; 124 CH MOVED HERE BEFORE CTRL AND SHIFT
+INSDAT = $7D ; 125 used by S: handler, tmp for char under cursor
+COUNTR = $7E ; 126 used by XIO DRAW command (2 bytes)
+
+; $80 to $FF are free if BASIC and floating point are not used.
+; If BASIC is not used, but FP is, $80 to $D0 are still free.
+; There is no way to use BASIC without constantly using FP, as all BASIC
+; numbers are FP (even "integers" such as line numbers).
+ZROFRE = $80 ; 128 FREE ZERO PAGE, 84 BYTES
+
+; BASIC zero page variables:
+LOMEM = $80 ; 128 LSB, BASIC start-of-memory pointer
+; $81 ; 129 MSB, LOMEM (not to be confused with the OS's MEMLO!)
+VNTP = $82 ; 130 LSB, BASIC start of Variable Name Table pointer
+; $83 ; 131 MSB, VNTP
+VNTD = $84 ; 132 LSB, BASIC end of Variable Name Table pointer (+1 byte)
+; $85 ; 133 MSB, VNTP
+VVTP = $86 ; 134 LSB, BASIC start of Variable Value Table pointer
+; $87 ; 135 MSB, VVTP
+STMTAB = $88 ; 136 LSB, BASIC start of Statement Table pointer
+; $89 ; 137 MSB, STMTAB
+STMCUR = $8A ; 138 LSB, BASIC current statement pointer
+; $8B ; 139 MSB, STMCUR
+STARP = $8C ; 140 LSB, BASIC current string/array table pointer
+; $8D ; 141 MSB, STARP (also points to end of BASIC program)
+RUNSTK = $8E ; 142 LSB, BASIC runtime stack pointer
+; $8F ; 143 MSG, RUNSTK
+; BASIC and the OS both use the name MEMTOP; I've renamed the BASIC one.
+BAS_MEMTOP = $90 ; 144 LSB, pointer to top of BASIC memory
+; $91 ; 145 MSB, BAS_MEMTOP
+MEOLFLG = $92 ; 146 "modified EOL flag register", whatever that is
+; $93 ; 147 listed as "spare" by Mapping's Errata
+;COX = $94 ; 148 current output index (?)
+POKADR = $95 ; 149 LSB, address of last POKE location
+; ; 150 MSB, POKADR
+
+; Locations $96 to $B5 are used for various purposes by BASIC,
+; and most of them are of little or no interest, even for someone
+; writing assembly code meant to run as a USR() routine, so I haven't
+; bothered listing them all here. See Compute! Books' "Atari BASIC Sourcebook"
+; for the gory details. In fact, you can see it here:
+
+; http://users.telenet.be/kim1-6502/6502/absb.html
+
+; It's fascinating (at least it is to me)... includes full source code
+; to Atari BASIC!
+
+; DATAD and DATALN are reset to 0 by BASIC RESTORE command.
+DATAD = $B6 ; 182 the data element being read (e.g. 10 for 10th item
+ ; in a DATA statement)
+DATALN = $B7 ; 183 LSB current DATA statement line number
+; $B8 ; 184 MSB, DATALN
+;ERRNUM = $B9 ; 185 Most recent error number. Gets cleared before you
+ ; can PEEK it; use ERRSAVE instead.
+STOPLN = $BA ; 186 LSB, line where a program stopped by STOP/break/error
+; $BB ; 187 MSB, STOPLN
+; what are $BC and $BD for?
+SAVCUR = $BE ; 190 Saves the current line address (LSB?)
+; $BF ; 191 presumably, the MSB of SAVCUR?
+IOCMD = $C0 ; 192, I/O Command (Mapping Errata)
+IODVC = $C1 ; 193, I/O Device (Mapping Errata)
+PROMPT = $C2 ; 194, Prompt character (Mapping Errata, presumably INPUT?)
+ERRSAVE = $C3 ; 195 Error code that caused a stop or TRAP
+;TEMPA = $C4 ; 196 a 2-byte temp
+;ZTEMP2 = $C6 ; 198 a 2-byte temp
+COLOR = $C8 ; 200 Stores color from COLOR command
+PTABW = $C9 ; 201 Number of columns between tab stops
+ ; (for PRINT with commas, not the TAB key)
+LOADFLG = $CA ; 202 Load in progress flag. I can tell you from bitter
+ ; experience that BASIC clears this often.
+
+; $CB - $CF are unused by BASIC or the ASM/ED cart.
+; $D0 and $D1 are unused by BASIC (does that mean they *are* used by ASM/ED?)
+
+; $D2 and $D3 are used by BASIC. Mapping Errata calls them the "BASIC
+; floating-point work area". They get cleared to 0 by BASIC, probably
+; every time a FP number is used (e.g. "POKE 210,1:? PEEK(210)" prints 0).
+; The BASIC source code labels $D2 as TVTYPE and VTYPE, and $D3 as
+; TVNUM and VNUM.
+
+; Floating point zero page variables:
+FPZRO = $D4 ; 212 FLOATING POINT RAM, 43 BYTES
+ ; (20070530 bkw: pretty sure that comment is wrong, and
+ ; should read 44 bytes; see $FF below)
+FR0 = $D4 ; 212 FP REGISTER 0 (also used by BASIC for USR() return val)
+ ; (FR0/FRE/FR1/FR2 are each 6 bytes long)
+FRE = $DA ; 218
+FR1 = $E0 ; 224 FP REGISTER 1
+FR2 = $E6 ; 230 FP REGISTER 2
+FRX = $EC ; 236 SPARE
+EEXP = $ED ; 237 VALUE OF E
+NSIGN = $ED ; 237 SIGN OF FP NUMBER
+ESIGN = $EF ; 239 SIGN OF FP EXPONENT
+FCHFLG = $F0 ; 240 FIRST CHARACTER FLAG
+DIGRT = $F1 ; 241 NUMBER OF DIGITS RIGHT OF DECIMAL POINT
+CIX = $F2 ; 242 INPUT INDEX
+INBUFF = $F3 ; 243 POINTER TO ASCII FP NUMBER
+ZTEMP1 = $F5 ; 245
+ZTEMP4 = $F7 ; 247
+ZTEMP3 = $F9 ; 249
+DEGFLG = $FB ; 251
+RADFLG = $FB ; 251 0=RADIANS, 6=DEGREES
+FLPTR = $FC ; 252 POINTER TO BCD FP NUMBER (2 bytes)
+FPTR2 = $FE ; 254 maybe a 2nd pointer to an FP number? (2 bytes)
+; $FF ; 255 This *definitely* is used by the FP package
+ ; Try: POKE 255,0:? SIN(1):? PEEK(255)
+
+;
+; PAGE 1
+;
+; 65O2 STACK
+;
+;
+
+;
+;
+; PAGE 2
+;
+;
+; 20070529 bkw: Bytes listed as "spare" should NOT be used for your own
+; purposes. They may not really be unused (just undocumented), and/or they
+; may be unused on the 800 but not the XL (or vice versa).
+INTABS = $0200 ; 512 INTERRUPT RAM
+VDSLST = $0200 ; 512 NMI VECTOR
+VPRCED = $0202 ; 514 PROCEED LINE IRQ VECTOR
+VINTER = $0204 ; 516 INTERRUPT LINE IRQ VECTOR
+VBREAK = $0206 ; 518 break key IRQ vector (not in OS rev. A)
+VKEYBD = $0208 ; 520 keyboard IRQ vector (not break/console keys)
+VSERIN = $020A ; 522 SERIAL INPUT READY IRQ
+VSEROR = $020C ; 524 SERIAL OUTPUT READY IRQ
+VSEROC = $020E ; 526 SERIAL OUTPUT COMPLETE IRQ
+VTIMR1 = $0210 ; 528 TIMER 1 IRQ vector
+VTIMR2 = $0212 ; 530 TIMER 2 IRQ vector
+VTIMR4 = $0214 ; 532 TIMER 4 IRQ vector
+VIMIRQ = $0216 ; 534 IRQ VECTOR
+CDTMV1 = $0218 ; 536 COUNTDOWN TIMER 1 vector
+CDTMV2 = $021A ; 538 COUNTDOWN TIMER 2 vector
+CDTMV3 = $021C ; 540 COUNTDOWN TIMER 3 vector
+CDTMV4 = $021E ; 542 COUNTDOWN TIMER 4 vector
+CDTMV5 = $0220 ; 544 COUNTDOWN TIMER 5 vector
+VVBLKI = $0222 ; 546 immediate VBLANK vector
+VVBLKD = $0224 ; 548 deferred VBLANK vector (ignore if CRITIC != 0)
+CDTMA1 = $0226 ; 550 COUNTDOWN TIMER 1 JSR ADDRESS
+CDTMA2 = $0228 ; 552 COUNTDOWN TIMER 2 JSR ADDRESS
+CDTMF3 = $022A ; 554 COUNTDOWN TIMER 3 FLAG
+SRTIMR = $022B ; 555 REPEAT TIMER
+CDTMF4 = $022C ; 556 COUNTDOWN TIMER 4 FLAG
+INTEMP = $022D ; 557 IAN'S TEMP (used by SETVBL routine)
+CDTMF5 = $022E ; 558 COUNTDOWN TIMER FLAG 5
+SDMCTL = $022F ; 559 DMACTL SHADOW
+SDLSTL = $0230 ; 560 DISPLAY LIST POINTER, LSB (shadow for DLISTL)
+SDLSTH = $0231 ; 561 display list pointer, MSB (shadow for DLISTH)
+SSKCTL = $0232 ; 562 SKCTL SHADOW
+; $0233 ; 563 (800) UNLISTED (Mapping calls this SPARE)
+XL_LCOUNT = $0233 ; 563 (XL) LOADER TEMP
+LPENH = $0234 ; 564 LIGHT PEN HORIZONTAL (shadow for PENH)
+LPENV = $0235 ; 565 LIGHT PEN VERTICAL (shadow for PENV)
+; $0236 ; 566 2 SPARE BYTES on OS rev A
+VBRKKY = $0236 ; 566 Break key interrupt vector (OS rev B and XL)
+BRKKY = VBRKKY ; "OS rev 5" listing calls it this
+; $0238 ; 568 (800) SPARE, 2 BYTES
+;XL_RELADR = $0238 ; 568 (XL) relocatable loader relative addr, 1200XL only!
+XL_VPIRQ = $0238 ; 568 (XL) PBI IRQ vector (not on 1200XL!)
+CDEVIC = $023A ; 570 DEVICE COMMAND FRAME BUFFER
+CAUX1 = $023C ; 572 DEVICE COMMAND AUX 1
+CAUX2 = $023D ; 573 DEVICE COMMAND AUX 2
+TEMP = $023E ; 574 TEMPORARY STORAGE
+ERRFLG = $023F ; 575 DEVICE ERROR FLAG (EXCEPT TIMEOUT)
+DFLAGS = $0240 ; 576 FLAGS FROM DISK SECTOR 1
+DBSECT = $0241 ; 577 NUMBER OF BOOT DISK SECTORS
+BOOTAD = $0242 ; 578 BOOT LOAD ADDRESS POINTER
+COLDST = $0244 ; 580 COLD START FLAG, 1 = COLD START IN PROGRESS
+; $0245 ; 581 (800) SPARE
+XL_RECLEN = $0245 ; 581 (XL) LOADER
+DSKTIM = $0246 ; 582 (800) DISK TIME OUT REGISTER
+; $0246 ; 582 (XL) RESERVED, 39 BYTES
+LINBUF = $0247 ; 583 (800) CHARACTER LINE BUFFER, 40 BYTES
+ ; LINBUF was deleted from the XL OS and replaced with:
+
+; $0247 - $024D are "reserved" on the 1200XL. On other XL's they are:
+XL_PDVMSK = $0247 ; 583 shadow for PBI device selection register @ $D1FF
+XL_SHPDVS = $0248 ; 584 shadow for PBI register (where??)
+XL_PDMSK = $0249 ; 585 PBI interrupt mask
+XL_RELADR = $024A ; 586 (XL) LSB, relocatable loader relative addr (NOT 1200XL)
+; $024B ; 587 MSB, XL_RELADR
+XL_PPTMPA = $024C ; 588 temporaries for relocatable loader
+XL_PPTMPX = $024D ; 589 "
+
+; $024E - $026A are "spare" on all XL/XE's
+
+; More XL stuff:
+XL_CHSALT = $026B ; 619 (XL) CHARACTER SET POINTER (ctrl-F4 on 1200XL)
+XL_VSFLAG = $026C ; 620 (XL) FINE SCROLL TEMPORARY
+XL_KEYDIS = $026D ; 621 (XL) KEYBOARD DISABLE (ctrl-F1 on 1200XL)
+XL_FINE = $026E ; 622 (XL) FINE SCROLL FLAG (POKE 622,255:GR.0)
+
+GPRIOR = $026F ; 623 P/M PRIORITY AND GTIA MODES (shadow for PRIOR)
+;GTIA = $026F ; 623 ; 20070529 bkw: does anyone define this?
+
+; Game controller shadows (joysticks/paddles)
+; Joystick directions and paddle triggers (buttons) are wired to the PIA.
+; Joystick triggers (fire buttons) and the actual paddle potentiometers
+; are wired to the GTIA.
+; If this seems a little odd, that's because it is :)
+
+; Paddles (potentiometers):
+PADDL0 = $0270 ; 624 (XL) 3 MORE PADDLES, (800) 7 MORE PADDLES
+PADDL1 = $0271 ; 625 (these are read in BASIC with PADDLE(x)
+PADDL2 = $0272 ; 626 (PADDL0-7 are shadows for POT0-7)
+PADDL3 = $0273 ; 627
+PADDL4 = $0274 ; 628 (PADDL4-7 are copies of PADDL0-3 on the XL)
+PADDL5 = $0275 ; 629
+PADDL6 = $0276 ; 630
+PADDL7 = $0277 ; 631
+
+; Joysticks (directions only)
+STICK0 = $0278 ; 632 (XL) 1 MORE STICK, (800) 3 MORE STICKS
+STICK1 = $0279 ; 633 (these are read in BASIC with STICK(x)
+STICK2 = $027A ; 634 (STICK0/1 are shadows for PORTA; STICK2/3 shadows PORTB)
+STICK3 = $027B ; 635
+; STICK0 is a shadow for bits 4-7 of PORTA (shifted 4 bits right)
+; STICK1 is a shadow for bits 0-3 of PORTA
+
+; On the 800:
+; STICK2 is a shadow for bits 4-7 of PORTB (shifted 4 bits right)
+; STICK3 is a shadow for bits 0-3 of PORTB
+
+; On the XL/XE series:
+; STICK2 and STICK3 are copies of STICK0 and STICK1, respectively.
+
+; In the XL/XE machines, there are only 2 joystick ports, and PORTB
+; (formerly joystick ports) is now used to control the MMU.
+
+; joystick directions are active low (1=not pressed) and decode as:
+
+; bit direction
+; 0 or 4 up
+; 1 or 5 down
+; 2 or 6 left
+; 3 or 7 right
+
+; A value of $0F in a STICKx register means no direction is being pressed.
+; When a direction is pressed, its bit becomes a logic 0, so e.g. $0E means
+; someone's moving the joystick up.
+
+; (bits 4-7 are only used when reading directly from the HW registers,
+; PORTA and PORTB).
+
+; Paddle triggers (buttons)
+PTRIG0 = $027C ; 636 (XL) 3 MORE PADDLE TRIGGERS, (800) 7 MORE
+PTRIG1 = $027D ; 637 (these are read in BASIC with PTRIG(x))
+PTRIG2 = $027E ; 638 (PTRIG0-3 are shadows for PORTA)
+PTRIG3 = $027F ; 639
+PTRIG4 = $0280 ; 640 (PTRIG4-7 are shadows for PORTB on the 800)
+PTRIG5 = $0281 ; 641 (they are copies of PTRIG0-3 on the XL)
+PTRIG6 = $0282 ; 642
+PTRIG7 = $0283 ; 643
+; In case someone doesn't already know this: The paddle triggers are wired
+; to the same pins on the joystick port as the left/right joystick directions.
+; Each pair of paddles uses left for the first paddle's trigger and right
+; for the second (so PTRIG0/1 are also the left/right bits in STICK0,
+; PTRIG2/3 are STICK1, etc).
+
+; Joystick triggers (buttons)
+STRIG0 = $0284 ; 644 (XL) 1 MORE STICK TRIGGER, (800) 3 MORE
+STRIG1 = $0285 ; 645 (these are read in BASIC with STRIG(x))
+STRIG2 = $0286 ; 646 (STRIG0-3 are shadows for TRIG0-3)
+STRIG3 = $0287 ; 647
+
+; C: handler variables:
+CSTAT = $0288 ; 648 (800) Cassette status register
+; note that CSTAT was deleted from the XL OS, and replaced with:
+XL_HIBYTE = $0288 ; 648 (XL) used by relocatable loader
+WMODE = $0289 ; 649 used by C: handler (0=read, 128-write)
+BLIM = $028A ; 650 cassette buffer data record size
+; $028B ; 651 (800) 5 SPARE BYTES (to $028F)
+XL_IMASK = $028B ; 651 (XL) used by relocatable loader
+XL_JVECK = $028C ; 652 (XL) (Mapping says it's unused)
+ ; 653 (XL) Presumably the MSB of JVECK (unused?)
+XL_NEWADR = $028E ; 654 (XL) LOADER RAM (2 bytes)
+
+; Misc. S: and/or E: handler variables:
+TXTROW = $0290 ; 656
+TXTCOL = $0291 ; 657
+TINDEX = $0293 ; 659 TEXT INDEX
+TXTMSC = $0294 ; 660
+TXTOLD = $0296 ; 662 OLD ROW AND OLD COL FOR TEXT, 2 BYTES
+; $0298 ; 664 4 SPARE BYTES
+TMPX1 = $029C ; 668 (800)
+; note that TMPX1 was deleted from the XL OS, and replaced with:
+XL_CRETRY = $029C ; 668 (XL) NUMBER OF COMMAND FRAME RETRIES
+ ; (moved from CRETRY on 800)
+SUBTMP = $029E ; 670
+HOLD2 = $029F ; 671
+DMASK = $02A0 ; 672
+TMPLBT = $02A1 ; 673
+ESCFLG = $02A2 ; 674
+TABMAP = $02A3 ; 675 15 BYTE BIT MAP FOR TAB SETTINGS
+LOGMAP = $02B2 ; 690 4 BYTE LOGICAL LINE START BIT MAP
+INVFLG = $02B6 ; 694 mask for inverse video ($80=inverse, 0=normal)
+FILFLG = $02B7 ; 695 FILL DURING DRAW FLAG
+TMPROW = $02B8 ; 696
+TMPCOL = $02B9 ; 697
+SCRFLG = $02BB ; 699 SCROLL FLAG
+HOLD4 = $02BC ; 700
+HOLD5 = $02BD ; 701 (800)
+; note that HOLD5 was deleted from the XL OS, and replaced with:
+XL_DRETRY = $02BD ; 701 (XL) NUMBER OF DEVICE RETRIES
+ ; (moved from DRETRY on 800)
+SHFLOC = $02BE ; 702
+BOTSCR = $02BF ; 703 24 NORM, 4 SPLIT
+
+; Color register shadows (HW registers are in GTIA)
+PCOLR0 = $02C0 ; 704 3 MORE PLAYER COLOR REGISTERS (shadows for COLPM0-3)
+PCOLR1 = $02C1 ; 705 (missiles use same color regs as same-numbered players!)
+PCOLR2 = $02C2 ; 706
+PCOLR3 = $02C3 ; 707
+COLOR0 = $02C4 ; 708 4 MORE GRAPHICS COLOR REGISTERS (shadows for COLPF0-3)
+COLOR1 = $02C5 ; 709 (text luminance in GR.0)
+COLOR2 = $02C6 ; 710 (text background and chroma in GR.0)
+COLOR3 = $02C7 ; 711
+COLOR4 = $02C8 ; 712 (background, shadow for COLBK)
+; On boot, system reset, or any time S:/E: devices are opened:
+; PCOLR0-3 are initialzed to 0 ($00, black)
+; COLOR0 is initialized to 40 ($28, orange)
+; COLOR1 is initialized to 202 ($CA, green)
+; COLOR2 is initialized to 148 ($94, blue)
+; COLOR3 is initialized to 70 ($46, red)
+; COLOR4 is initialized to 0 ($00, black)
+
+; $02C9 713 (800) 23 SPARE BYTES
+; XL relocatable handler and other variables:
+XL_RUNADR = $02C9 ; 713 (XL) LOADER VECTOR
+XL_HIUSED = $02CB ; 715 (XL) LOADER VECTOR
+XL_ZHIUSE = $02CD ; 717 (XL) LOADER VECTOR
+XL_GBYTEA = $02CF ; 719 (XL) LOADER VECTOR
+XL_LOADAD = $02D1 ; 721 (XL) LOADER VECTOR
+XL_ZLOADA = $02D3 ; 723 (XL) LOADER VECTOR
+XL_DSCTLN = $02D5 ; 725 (XL) DISK SECTOR SIZ
+XL_ACMISR = $02D7 ; 727 (XL) RESERVED
+XL_KRPDER = $02D9 ; 729 (XL) KEY AUTO REPEAT DELAY
+XL_KEYREP = $02DA ; 730 (XL) KEY AUTO REPEAT RATE
+XL_NOCLIK = $02DB ; 731 (XL) KEY CLICK DISABLE (ctrl-F3 on 1200XL)
+XL_HELPFG = $02DC ; 732 (XL) HELP KEY FLAG
+XL_DMASAV = $02DD ; 733 (XL) SDMCTL (DMA) SAVE (ctrl-F2 on 1200XL)
+XL_PBPNT = $02DE ; 734 (XL) PRINTER BUFFER POINTER (moved from PBPNT on 800)
+XL_PBUFSZ = $02DF ; 735 (XL) PRINTER BUFFER SIZE (moved from PBUFSZ on 800)
+; note that PTEMP was deleted from the XL OS
+
+; DOS/FMS variables:
+GLBABS = $02E0 ; 736 GLOBAL VARIABLES, 4 SPARE BYTES (if DOS not loaded)
+ ; If DOS/FMS is loaded:
+RUNAD = $02E0 ; 736 (DOS) Run address for binary file (LSB/MSB)
+INITAD = $02E2 ; 736 (DOS) Init address for binary file (LSB/MSB)
+
+; SYSEQU.ASM defines these:
+GOADR = RUNAD
+INITADR = INITAD
+
+; OS variables:
+RAMSIZ = $02E4 ; 740 PERMANENT START OF ROM POINTER
+MEMTOP = $02E5 ; 741 END OF FREE RAM
+MEMLO = $02E7 ; 743 LSB, points to bottom of free memory ($0700 if DOS
+ ; not booted). Not to be confused with BASIC's LOMEM!
+; $02E8 ; 744 MSB of MEMLO
+
+; $02E9 ; 745 (800) SPARE
+XL_HNDLOD = $02E9 ; 745 (XL) HANDLER LOADER FLAG
+
+DVSTAT = $02EA ; 746 DEVICE STATUS BUFFER, 4 BYTES
+CBAUDL = $02EE ; 750 CASSETTE BAUD RATE, 2 BYTES
+CRSINH = $02F0 ; 752 1 = INHIBIT CURSOR
+KEYDEL = $02F1 ; 753 KEY DELAY AND RATE (aka debounce counter)
+CH1 = $02F2 ; 754 prior keyboard character code
+CHACT = $02F3 ; 755 (shadow for CHACTL)
+CHBAS = $02F4 ; 756 CHARACTER SET POINTER (shadow for CHBASE)
+
+; These next 4 are located elsewhere on the 800 OS:
+XL_NEWROW = $02F5 ; 757 (XL) DRAW DESTINATION
+XL_NEWCOL = $02F6 ; 758 (XL) DRAW DESTINATION
+XL_ROWINC = $02F8 ; 760 (XL)
+XL_COLINC = $02F9 ; 761 (XL)
+; $02F5 - $02F9 are "spare" on the 800.
+
+CHAR = $02FA ; 762 most recent character read/written (screen code)
+ATACHR = $02FB ; 763 ATASCII CHARACTER FOR CIO
+CH = $02FC ; 764 last key pressed (internal scan code)
+FILDAT = $02FC ; 764 COLOR FOR SCREEN FILL
+DSPFLG = $02FE ; 766 DISPLAY CONTROL CHARACTERS FLAG
+SSFLAG = $02FF ; 767 DISPLAY START/STOP FLAFG
+
+;
+; PAGE 3
+;
+;
+; RESIDENT DISK HANDLER/SIO INTERFACE
+;
+; The DCB is used for SIO (serial I/O).
+DCB = $0300 ; 768 DEVICE CONTROL BLOCK
+DDEVIC = $0300 ; 768 device ID ($31-$38 for D1:-D8:)
+DUNIT = $0301 ; 769 disk/device unit numder
+DCOMND = $0302 ; 770 device command
+DSTATS = $0303 ; 771 status code (set by OS)
+DBUFLO = $0304 ; 772 data buffer LSB (set by user)
+DBUFHI = $0305 ; 773 data buffer MSB (set by user)
+DTIMLO = $0306 ; 774 timeout (set by user, units of 60/64 seconds)
+DUNUSE = $0307 ; 775 unused
+DBYTLO = $0308 ; 776 number of bytes to transfer, LSB
+DBYTHI = $0309 ; 777 number of bytes to transfer, MSB
+DAUX1 = $030A ; 778 LSB of sector number (for disk) (set by user)
+DAUX2 = $030B ; 779 MSB of sector number (for disk)
+TIMER1 = $030C ; 780 INITIAL TIMER VALUE
+ADDCOR = $030E ; 782 (800) ADDITION CORRECTION
+; note that ADDCOR was deleted from the XL OS, and replaced with:
+XL_JMPERS = $030E ; 782 (XL) OPTION JUMPERS
+CASFLG = $030F ; 783 CASSETTE MODE WHEN SET
+TIMER2 = $0310 ; 784 FINAL VALUE, TIMERS 1 & 2 DETERMINE BAUD RATE
+TEMP1 = $0312 ; 786
+XL_TEMP2 = $0313 ; 787 (XL)
+TEMP2 = $0314 ; 788 (800)
+XL_PTIMOT = $0314 ; 788 (XL) PRINTER TIME OUT
+TEMP3 = $0315 ; 789
+SAVIO = $0316 ; 790 SAVE SERIAL IN DATA PORT
+TIMFLG = $0317 ; 791 TIME OUT FLAG FOR BAUD RATE CORRECTION
+STACKP = $0318 ; 792 SIO STACK POINTER SAVE
+TSTAT = $0319 ; 793 TEMPORARY STATUS HOLDER
+HATABS = $031A ; 794 HANDLER ADDRESS TABLE, 38 BYTES
+MAXDEV = $0321 ; 801 MAXIMUM HANDLER ADDRESS INDEX
+XL_PUPBT1 = $033D ; 829 (XL) POWER-UP/RESET
+XL_PUPBT2 = $033E ; 830 (XL) POWER-UP/RESET
+XL_PUPBT3 = $033F ; 831 (XL) POWER-UP/RESET
+
+; IOCB's, 8 of them, 16 bytes each.
+; Set X register to (IOCB number * 16), and use e.g. ICCOM,x
+;
+IOCB = $0340 ; 832 ; IOCB base address
+ICHID = $0340 ; 832 ; Handler ID (set by OS)
+ICDNO = $0341 ; 833 ; Device number (set by OS)
+ICCOM = $0342 ; 834 ; Command byte (see C_* constants) (set by user)
+ICCMD = ICCOM ; ; alternate name for ICCOM, according to Mapping.
+ICSTA = $0343 ; 835 ; Status (set by OS)
+ICBAL = $0344 ; 836 ; Buffer address, LSB (set by user)
+ICBAH = $0345 ; 837 ; Buffer address, MSB (set by user)
+ICPTL = $0346 ; 838 ; Put-one-byte address minus one, LSB (set by OS)
+ICPTH = $0347 ; 839 ; Put-one-byte address minus one, MSB (set by OS)
+ICBLL = $0348 ; 840 ; Buffer length, LSB (set by user)
+ICBLH = $0349 ; 841 ; Buffer length, MSB (set by user)
+ICAX1 = $034A ; 842 ; AUX1 byte (2nd param in BASIC OPEN) (set by user)
+ICAX2 = $034B ; 843 ; AUX2 byte (4rd param in BASIC OPEN) (set by user)
+ICAX3 = $034C ; 844 ; AUX3 byte (used by NOTE/POINT) (set by user)
+ICAX4 = $034D ; 845 ; AUX4 byte (used by NOTE/POINT) (set by user)
+ICAX5 = $034E ; 846 ; AUX5 byte (used by NOTE/POINT) (set by user)
+ICAX6 = $034F ; 847 ; Spare aux byte
+; OTHER IOCB's, 112 BYTES ($300 + $10 * channel)
+
+IOCBLEN = ICAX6-IOCB+1 ; length of one IOCB (from SYSEQU.ASM)
+
+; Alternative names for the above. I found these in SYSEQU.ASM, as
+; distributed with the disk version of Mac65.
+ICBADR = ICBAL
+ICPUT = ICPTL
+ICBLEN = ICBLL
+ICAUX1 = ICAX1
+ICAUX2 = ICAX2
+ICAUX3 = ICAX3
+ICAUX4 = ICAX4
+ICAUX5 = ICAX5
+ICAUX6 = ICAX6
+
+PRNBUF = $03C0 ; 960 PRINTER BUFFER, 40 BYTES
+; $03E8 ; 1000 (800) 21 SPARE BYTES
+XL_SUPERF = $03E8 ; 1000 (XL) SCREEN EDITOR
+XL_CKEY = $03E9 ; 1001 (XL) START KEY FLAG
+XL_CASSBT = $03EA ; 1002 (XL) CASSETTE BOOT FLAG
+XL_CARTCK = $03EB ; 1003 (XL) CARTRIDGE CHECKSUM
+XL_ACMVAR = $03ED ; 1005 (XL) RESERVED, 10 BYTES (to $03F7)
+XL_BASICF = $03F8 ; 1006 (XL) 0 if ROM-BASIC enabled, 1 if not
+XL_MINTLK = $03F9 ; 1017 (XL) RESERVED
+XL_GINTLK = $03FA ; 1018 (XL) CARTRIDGE INTERLOCK
+XL_CHLINK = $03FB ; 1019 (XL) HANDLER CHAIN, 2 BYTES
+CASBUF = $03FD ; 1021 CASSETTE BUFFER, 131 BYTES TO $047F
+
+; Layout of the cassette buffer after a cassette block is read:
+
+; Baud correction ($55 $55) bytes are located at offsets 0 and 1
+; Control byte is at offset 2 ($03FF):
+; Actual data (128 bytes) runs from offset 3 ($0400) to $047F.
+; Each cassette frame has a 1 byte checksum after the 128 data bytes, but
+; the checksum is NOT stored anywhere in the cassette buffer!
+
+; CONTROL BYTE VALUES
+; Value Meaning
+; 250 ($FA) Partial record follows. The actual number of bytes is stored
+; in the last byte of the record (CASBUF+130, or $047F).
+; 252 ($FC) Record full; 128 bytes follow.
+; 254 ($FE) End of File (EOF) record; followed by 128 zero bytes.
+
+; Boot tapes normally don't have partial or EOF records, but BASIC
+; CLOAD/LOAD/LIST and data file tapes do.
+
+; Mapping the Atari says the first disk boot sector is read into CASBUF also.
+
+;
+;
+; PAGE 4
+;
+;
+USAREA = $0480 ; 1152 128 SPARE BYTES (but used by BASIC)
+;
+; SEE APPENDIX C FOR PAGES 4 AND 5 USAGE
+
+;
+;
+;
+;
+; PAGE 5
+;
+PAGE5 = $0500 ; 1280 127 FREE BYTES
+; $057E 1406 129 FREE BYTES IF FLOATING POINT ROUTINES NOT USED
+;
+;FLOATING POINT NON-ZERO PAGE RAM, NEEDED ONLY IF FP IS USED
+; (20070529 bkw: BASIC constantly uses FP! Also, it uses some of these
+; addresses for its own purposes.)
+;
+LBPR1 = $057E ; 1406 LBUFF PREFIX 1
+LBPR2 = $05FE ; 1534 LBUFF PREFIX 2
+LBUFF = $0580 ; 1408 LINE BUFFER
+PLYARG = $05E0 ; 1504 POLYNOMIAL ARGUMENTS
+FPSCR = $05E6 ; 1510 PLYARG+FPREC
+FPSCR1 = $05EC ; 1516 FPSCR+FPREC
+FSCR = $05E6 ; 1510 =FPSCR
+FSCR1 = $05EC ; 1516 =FPSCR1
+LBFEND = $05FF ; 1535 END OF LBUFF
+
+;
+; PAGE 6
+;
+;
+PAGE6 = $0600 ; 1536 256 FREE BYTES
+
+;
+;
+; PAGE 7
+;
+;
+BOOTRG = $0700 ; 1792 PROGRAM AREA
+; Boot disks (including DOS) are generally loaded here. Also, BASIC RAM
+; (variables and program) starts here, if BASIC is booted without DOS.
+
+; Page 80 (XL): Self-test (aka diagnostic) ROM is mapped at $5000,
+; if enabled with bit 7 of PORTB. Normally only happens if you boot without
+; BASIC, cartridge, tape, or disk... or if the OS detects a memory error
+; during boot.
+
+;
+;
+; UPPER ADDRESSES
+;
+;
+RITCAR = $8000 ;32768 RAM IF NO CARTRIDGE (extends to $9FFF)
+LFTCAR = $A000 ;40960 RAM IF NO CARTRIDGE (extends to $BFFF)
+
+; These 2 are from the Atari System Reference Manual, chapter 12:
+CARTA = LFTCAR
+CARTB = RITCAR
+
+CARTLOC = $BFFA ;49146 cartridge run address (from SYSEQU.ASM)
+
+; Carts were originally 8K only when the 400/800 were first released.
+; There were plans to release 16K programs on two cartridges, but this
+; never happened (the price of 16K ROMs came down, I guess). 16K cartridges
+; go in the left slot, but they actually use the address space for both
+; the right and left slots.
+
+; Mapping the Atari has this to say about cartridges:
+;; Byte Purpose
+;; Left (A) Right(B)
+;; 49146 ($BFFA) 40954 ($9FFA) Cartridge start address (low byte)
+;;
+;; 49147 ($BFFB) 40955 ($9FFB) Cartridge start address (high byte)
+;;
+;; 49148 ($BFFC) 40956 ($9FFC) Reads zero if a cartridge is
+;; inserted, non-zero when no cartridge is present. This information
+;; is passed down to the page zero RAM: if the A cartridge is plugged
+;; in, then location 6 will read one; if the B cartridge is plugged in,
+;; then location 7 will read one; otherwise they will read zero.
+;;
+;; 49149 ($BFFD) 40957 ($9FFD) Option byte. If BIT 0 equals one,
+;; then boot the disk (else there is no disk boot). If BIT 2 equals one,
+;; then initialize and start the cartridge (else initialize but do not
+;; start). If BIT 7 equals one, then the cartridge is a diagnostic
+;; cartridge which will take control, but not initialize the OS (else
+;; non-diagnostic cartridge). Diagnostic cartridges were used by
+;; Atari in the development of the system and are not available to the
+;; public.
+;;
+;; 49150 ($BFFE) 40958 ($9FFE) Cartridge initialization address
+;; low byte.
+;;
+;; 49151 ($BFFF) 40959 ($9FFF) Cartridge initialization address
+;; high byte. This is the address to which the OS will jump during all
+;; powerup and RESETs.
+;;
+;; The OS makes temporary use of locations 36876 to 36896 ($900C to
+;; $9020) to set up vectors for the interrupt handler. See the OS
+;; listings pages 31 and 81. This code was only used in the
+;; development system used to design the Atari.
+
+
+; Page 192
+
+C0PAGE = $C000 ;49152 (800) EMPTY, 4K BYTES
+ ; 20070529 bkw: unmapped address space.
+ ; Mapping the Atari erroneously lists this as "unused ROM".
+ ; There are upgrades to the 800 to give 4K of RAM here
+ ; (for a total of 52K of RAM), or ROM (Omnimon?).
+ ; Also, there is RAM here if you boot the Translator
+ ; disk on an XL.
+
+; (XL) $C000 also contains info about the ROM revision. From Mapping:
+
+;Bytes 49152-49163 ($C000-$C00B) are used to identify the computer
+;and the ROM in the $C000-$DFFF block:
+;
+;Byte Use
+;49152-3/C000-1 Checksum (LSB/MSB) of all the bytes
+; in ROM except the checksum bytes
+; themselves.
+;49154/C002 Revision date, stored in the form
+; DDMMYY. This is DD, day, usually $10.
+;49155/C003 Revision date, month; usually $05.
+;49156/C004 Revision date, year; usually $83.
+;49157/C005 Reserved option byte; reads zero for
+; the 1200, 800XL, and 130XE.
+;49158/C006 Part number in the form AANNNNNN;
+; AA is an ASCII character and
+; NNNNNN is a four-bit BCD digit. This is
+; byte A1.
+;49159-62/C007-A Part number, bytes A2, N1-N6 (each
+; byte has two N values of four bits
+; each).
+;49163/C00B Revision number. Mapping author's 800XL and 130XE say 2.
+
+;C0PAGE = $C000 ;49152 (XL) OS ROM, mostly interrupt handlers
+; $C800 51200 (XL) START OF OS ROM
+CHORG2 = $CC00 ;52224 (XL) INTERNATIONAL CHARACTER SET
+
+
+
+;
+;
+; HARDWARE REGISTERS
+;
+;
+; SEE REGISTER LIST FOR MORE INFORMATION
+;
+;
+
+; GTIA
+GTIA = $D000
+HPOSP0 = $D000 ;53248 (W) ; P/M positions (no shadows)
+HPOSP1 = $D001 ;53249 (W)
+HPOSP2 = $D002 ;53250 (W)
+HPOSP3 = $D003 ;53251 (W)
+HPOSM0 = $D004 ;53252 (W)
+HPOSM1 = $D005 ;53253 (W)
+HPOSM2 = $D006 ;53254 (W)
+HPOSM3 = $D007 ;53255 (W)
+SIZEP0 = $D008 ;53256 (W) ; P/M size regs (no shadows)
+SIZEP1 = $D009 ;53257 (W)
+SIZEP2 = $D00A ;53258 (W)
+SIZEP3 = $D00B ;53259 (W)
+SIZEM = $D00C ;53260 (W)
+M0PF = $D000 ;53248 (R) ; collision regs (no shadows)
+M1PF = $D001 ;53249 (R)
+M2PF = $D002 ;53250 (R)
+M3PF = $D003 ;53251 (R)
+P0PF = $D004 ;53252 (R)
+P1PF = $D005 ;53253 (R)
+P2PF = $D006 ;53254 (R)
+P3PF = $D007 ;53255 (R)
+M0PL = $D008 ;53256 (R)
+M1PL = $D009 ;53257 (R)
+M2PL = $D00A ;53258 (R)
+M3PL = $D00B ;53259 (R)
+P0PL = $D00C ;53260 (R)
+P1PL = $D00D ;53261 (R)
+P2PL = $D00E ;53262 (R)
+P3PL = $D00F ;53263 (R)
+GRAFP0 = $D00D ;53261 (W) ; direct (non-DMA) P/M graphics regs (no shadows)
+GRAFP1 = $D00E ;53262 (W)
+GRAFP2 = $D00F ;53263 (W)
+GRAFP3 = $D010 ;53264 (W)
+GRAFM = $D011 ;53265 (W)
+TRIG0 = $D010 ;53264 (R) ; Joystick triggers (shadows @ STRIG0-3)
+TRIG1 = $D011 ;53265 (R)
+TRIG2 = $D012 ;53266 (R)
+TRIG3 = $D013 ;53267 (R)
+PAL = $D014 ;53268 (R) ; PAL/NTSC detect (no shadow)
+ ; PAL supposedly moved to XL_PALNTS on XL; what was it
+ ; replaced with?
+COLPM0 = $D012 ;53266 (W) ; P/M colors (shadows @ PCOLR0-3)
+COLPM1 = $D013 ;53267 (W)
+COLPM2 = $D014 ;53268 (W)
+COLPM3 = $D015 ;53269 (W)
+COLPF0 = $D016 ;53270 (W) ; Playfield colors (shadows @ COLOR0-3)
+COLPF1 = $D017 ;53271 (W)
+COLPF2 = $D018 ;53272 (W)
+COLPF3 = $D019 ;53273 (W)
+COLBK = $D01A ;53274 (W) ; Background color (shadow @ COLOR4)
+PRIOR = $D01B ;53275 (W) ; GTIA priority (shadow @ GPRIOR)
+GTIAR = $D01B ;53275 (R?)
+VDELAY = $D01C ;53276 (W)
+GRACTL = $D01D ;53277 (W)
+HITCLR = $D01E ;53278 (W), latch
+CONSOL = $D01F ;53279 (W=keyclick spkr, R=console keys)
+
+; $D020 - $D0FF are mirrors of GTIA address space
+; $D100 - $D1FF are supposed to be unused (unmapped) on the 800
+; On the XL, $D100 - $D1FF is switched to device memory during PBI I/O
+
+; POKEY
+POKEY = $D200
+; no shadows for AUDC/AUDF
+AUDF1 = $D200 ;53760 (W) ; Audio frequency 1
+AUDC1 = $D201 ;53761 (W) ; Audio control 1 (distortion/volume)
+AUDF2 = $D202 ;53762 (W)
+AUDC2 = $D203 ;53763 (W)
+AUDF3 = $D204 ;53764 (W)
+AUDC3 = $D205 ;53765 (W)
+AUDF4 = $D206 ;53766 (W)
+AUDC4 = $D207 ;53767 (W)
+
+; POT0-7 shadows at PADDL0-7
+POT0 = $D200 ;53760 (R) ; Paddle positions
+POT1 = $D201 ;53761 (R)
+POT2 = $D202 ;53762 (R)
+POT3 = $D203 ;53763 (R)
+POT4 = $D204 ;53764 (R) ; pots 3-7 don't exist on XL/XE
+POT5 = $D205 ;53765 (R)
+POT6 = $D206 ;53766 (R)
+POT7 = $D207 ;53767 (R)
+
+AUDCTL = $D208 ;53768 (W) ; Audio control (no shadow)
+ALLPOT = $D208 ;53768 (R) (no shadow)
+STIMER = $D209 ;53769 (W) (no shadow)
+KBCODE = $D209 ;53769 (R) (shadow @ CH)
+SKREST = $D20A ;53770 (W) (latch)
+RANDOM = $D20A ;53770 (R) (no shadow)
+POTGO = $D20B ;53771 (W) (latch)
+; $D20C (53772) is unused
+SEROUT = $D20D ;53773 (W) (no shadow)
+SERIN = $D20D ;53773 (R) (no shadow)
+IRQEN = $D20E ;53774 (W) (shadow @ POKMSK)
+IRQST = $D20E ;53774 (R)
+SKCTL = $D20F ;53775 (W) (shadow @ SSKCTL)
+SKSTAT = $D20F ;53775 (R)
+
+; $D210 - $D2FF are mirrors of POKEY address space. The "stereo POKEY"
+; modification adds a second POKEY chip, usually addressed at $D210.
+
+; PIA
+; No shadow regs for PIA regs
+PIA = $D300
+PORTA = $D300 ;54016
+PORTB = $D301 ;54017
+PACTL = $D302 ;54018
+PBCTL = $D303 ;54019
+
+; $D304 - $D3FF are mirrors of PIA address space
+
+; ANTIC
+ANTIC = $D400
+DMACTL = $D400 ;54272 (W) (shadow @ SDMCTL)
+CHACTL = $D401 ;54273 (W) (shadow @ CHACT)
+DLISTL = $D402 ;54274 (W) (shadow @ SDLSTL)
+DLISTH = $D403 ;54275 (W) (shadow @ SDLSTH)
+HSCROL = $D404 ;54276 (W) (no shadow)
+VSCROL = $D405 ;54277 (W) (no shadow)
+; $D406 (54278) is unused
+PMBASE = $D407 ;54279 (W) (no shadow)
+; $D408 (54280) is unused
+CHBASE = $D409 ;54281 (W) (shadow @ CHBAS)
+WSYNC = $D40A ;54282 (W), latch (data written doesn't matter)
+VCOUNT = $D40B ;54283 (R) (no shadow)
+PENH = $D40C ;54284 (R) (shadow @ LPENH)
+PENV = $D40D ;54285 (R) (shadow @ LPENV)
+NMIEN = $D40E ;54286 (W) (no shadow)
+NMIRES = $D40F ;54287 (W), latch?
+NMIST = $D40F ;54287 (R) (no shadow)
+
+; $D410 - $D4FF are mirrors of ANTIC address space
+
+CCNTL = $D500 ;54528 Cartridge control (sometimes used for bankswitching)
+; $D500 - $D5FF is supposed to be all be mapped to CCNTL
+
+; $D600 - $D7FF is unmapped? used by PBI on XL? seems to read all $FF
+
+;
+; FLOATING POINT MATH ROUTINES
+;
+; From Mapping:
+; These entry points are the same on 400/800 and XL OS, though the
+; routines themselves are different (bugfixed/optimized for XL)
+; Also, on the XL, the $D800 area is bankswitched to PBI device ROM,
+; during PBI I/O. Not sure if all of $D800 - $DFFF is switched out
+; or just part of it.
+AFP = $D800 ;55296 ASCII to Floating Point (FP) conversion.
+FASC = $D8E6 ;55526 FP value to ASCII conversion.
+IFP = $D9AA ;55722 Integer to FP conversion
+FPI = $D9D2 ;55762 FP to Integer conversion
+ZFR0 = $DA44 ;55876 Clear FR0 (set all bytes to 0)
+ZF1 = $DA46 ;55878 Clear FR1 (set all bytes to 0) (aka AF1 (De Re))
+FSUB = $DA60 ;55904 FP subtract: FR0 = FR0 - FR1
+FADD = $DA66 ;55910 FP add: FR0 = FR0 + FR1
+FMUL = $DADB ;56027 FP multiply: FR0 = FR0 * FR1
+FDIV = $DB28 ;56104 FP divide: FR0 = FR0 / FR1
+PLYEVL = $DD40 ;56640 FP polynomial evaluation
+FLD0R = $DD89 ;56713 Load FP number into FR0 from 6502 X/Y registers
+FLD0P = $DD8D ;56717 Load FP number into FR0 from FLPTR
+FLD1R = $DD98 ;56728 Load FP number into FR1 from 6502 X/Y registers
+FLD1P = $DD9C ;56732 Load FP number into FR1 from FLPTR
+FST0R = $DDA7 ;56743 Store FP number into 6502 X/Y regs from FR0
+FST0P = $DDAB ;56747 Store FP number from FR0, using FLPTR
+FMOVE = $DDB6 ;56758 Move FP number from FR0 into FR1 (FR1 = FR0)
+EXP = $DDC0 ;56768 FP base e exponentiation
+EXP10 = $DDCC ;56780 FP base 10 exponentiation
+LOG = $DECD ;57037 FP natural logarithm
+LOG10 = $DED1 ;57041 FP base 10 logarithm
+
+;
+;
+; OPERATING SYSTEM
+;
+;
+; MODULE ORIGIN TABLE
+;
+CHORG = $E000 ;57344 CHARACTER SET, 1K
+VECTBL = $E400 ;58368 VECTOR TABLE
+VCTABL = $E480 ;58496 RAM VECTOR INITIAL VALUE TABLE
+CIOORG = $E4A6 ;58534 CIO HANDLER
+INTORG = $E6D5 ;59093 INTERRUPT HANDLER
+SIOORG = $E944 ;59716 SIO DRIVER
+DSKORT = $EDEA ;60906 DISK HANDLER
+PRNORG = $EE78 ;61048 PRINTER HANDLER
+CASORG = $EE78 ;61048 CASSETTE HANDLER
+MONORG = $F0E3 ;61667 MONITOR/POWER UP MODULE
+KBDORG = $F3E4 ;62436 KEYBOARD/DISPLAY HANDLER
+;
+;
+; VECTOR TABLE, CONTAINS ADDRESSES OF CIO ROUTINES IN THE
+; FOLLOWING ORDER. THE ADDRESSES IN THE TABLE ARE TRUE ADDRESSES-1
+;
+; ADDRESS + 0 OPEN
+; + 2 CLOSE
+; + 4 GET
+; + 6 PUT
+; + 8 STATUS
+; + A SPECIAL
+; + C JMP TO INITIALIZATION
+; + F NOT USED
+;
+;
+
+; 20070529 bkw: why are they address minus one? because they are called
+; via RTS: a JSR actually pushes the return address minus one, and RTS
+; increments the address on the stack after popping it. The Atari OS
+; "pretends" to have done a JSR by pushing the address-1 on the stack,
+; then executes RTS, which "returns" to the correct address.
+
+EDITRV = $E400 ;58368 EDITOR
+SCRENV = $E410 ;58384 SCREEN
+KEYBDV = $E420 ;58400 KEYBOARD
+PRINTV = $E430 ;58416 PRINTER
+CASETV = $E440 ;58432 CASSETTE
+;
+; ROM VECTORS
+;
+; 20070529 bkw: These consist of a JMP xxxx instruction in the ROM.
+DSKINV = $E453 ;58451
+CIOV = $E456 ;58454 ; Main CIO entry point!
+SIOV = $E459 ;58457 ; Main SIO entry point!
+SETVBV = $E45C ;58460
+SYSVBV = $E45F ;58463
+VBIVAL = $E460 ;58464 ADR AT VVBLKI (operand of JMP @ $E45F)
+XITVBV = $E462 ;58466 EXIT VBI
+VBIXVL = $E463 ;58467 ADR AT VVBLKD (operand of JMP @ $E462)
+SIOINV = $E465 ;58469
+SENDEV = $E468 ;58472
+INTINV = $E46B ;58475
+CIOINV = $E46E ;58478
+BLKBDV = $E471 ;58481 MEMO PAD MODE (self-test in XL)
+WARMSV = $E474 ;58484 ; warmstart (RESET key jumps here)
+COLDSV = $E477 ;58487 ; coldstart (reboot) the Atari
+RBLOKV = $E47A ;58490
+CSOPIV = $E47D ;58493
+
+; SYSEQU.ASM defines this:
+CIO = CIOV
+
+; XL-only entry points:
+XL_SELFSV = BLKBDV ; self-test (same entry point as 800 memo pad)
+XL_SELFTST = BLKBDV ; alt. name (Mapping)
+XL_PUPDIV = $E480 ;58496 (XL) Power-up ATARI logo (1200XL only), or self-test
+XL_SLFTSV = $E483 ;58499 (XL) Self-test vector (points to $5000)
+XL_PENTV = $E486 ;58502 (XL) Entry to the handler uploaded from peripheral
+ ; or disk (is this for the PBI?)
+XL_PHUNLV = $E489 ;58505 (XL) Entry to uploaded handler unlink (PBI?)
+XL_PHINIV = $E48C ;58508 (XL) Entry to uploaded handler init (PBI?)
+XL_GPDVV = $E48F ;58511 (XL) General-purpose parallel device handler
+ ; (copy to HATABS to use)
+
+;;;;; Here endeth the list of official mnemonics
+
+; Mapping has this to say about the XL ROMs:
+;Byte Use
+;65518/FFEE Revision date D1 and D2 (four-bit BCD)
+;65519/FFEF Revision date M1 and M2
+;65520/FFF0 Revision date Y1 and Y2
+;65521/FFF1 Option byte; should read 1 for the
+; 1200XL (Mapping author's 800XL reads 2)
+;65522-26/FFF2-6 Part number in the form AANNNNNN
+;65527/FFF7 Revision number (again, mine reads 2)
+;65528-9/FFF8-9 Checksum, bytes (LSB/MSB)
+; There don't seem to be any known mnemonics for the above...
+
+; 20061120 bkw: display list stuff. These are not official Atari mnemonics,
+; but they *are* somewhat based on the "Checkers Demo" by Carol Shaw,
+; in the Atari Hardware Manual (she didn't define all these, and she didn't
+; use the "DL_" prefix, probably because her assembler was limited to
+; 6-character labels and/or didn't support the underscore).
+
+; blank lines, 1-8 scanlines high
+DL_BLANK1 = $00
+DL_BLANK2 = $10
+DL_BLANK3 = $20
+DL_BLANK4 = $30
+DL_BLANK5 = $40
+DL_BLANK6 = $50
+DL_BLANK7 = $60
+DL_BLANK8 = $70
+
+; modifier bits..
+DL_VSCROLL = $10
+DL_HSCROLL = $20
+DL_LMS = $40
+DL_DLI = $80
+
+; graphics modes (these are the BASIC modes)
+; If you're more familiar with the ANTIC modes, nobody's forcing you
+; to use these :)
+DL_GR0 = $02
+DL_GR1 = $06
+DL_GR2 = $07
+DL_GR3 = $08
+DL_GR4 = $09
+DL_GR5 = $0A
+DL_GR6 = $0B
+DL_GR7 = $0D
+DL_GR8 = $0F
+DL_GR12 = $04 ; GR. 12-15 only supported by GRAPHICS command on XL/XE,
+DL_GR13 = $05 ; but they exist on all ANTIC revisions
+DL_GR14 = $0C
+DL_GR15 = $0E ; AKA "graphics 7.5"
+; No GRAPHICS mode for ANTIC $03 (true descender) mode
+
+; jump instructions
+DL_JMP = $01 ; jump without vertical blank (used to skip over 1K boundary)
+DL_JVB = $41 ; jump & wait for VBLANK (end of display list)
+
+; How to use the above: here's a sample display list for GR.0, with a DLI
+; on screen line 10.
+
+; dlist:
+; ; 4*8 = 32 blank lines at start of display
+; byte DL_BLANK8, DL_BLANK8, DL_BLANK8, DL_BLANK8
+;
+; byte DL_GR0 | DL_LMS ; display GR.0 line, and load screen memory address..
+; word screen_ram ; ...from our screen memory (declared elsewhere)
+;
+; ; 8 more GR.0 lines
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+;
+; byte DL_GR0 | DL_DLI ; another GR.0 line, with the DLI bit enabled
+;
+; ; lines 11-24 (14 more GR.0 bytes)
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+;
+; ; that's 24 lines, so finish with a VBLANK
+; byte DL_JVB ; jump (and wait), to...
+; word dlist ; ...the beginning.
diff --git a/src/col64/font4x5.inc b/src/col64/font4x5.inc
new file mode 100644
index 0000000..739e85e
--- /dev/null
+++ b/src/col64/font4x5.inc
@@ -0,0 +1,48 @@
+ byte $04, $04, $04, $00, $04 ; [0] 32,33 ,!
+ byte $AA, $AF, $0A, $0F, $0A ; [5] 34,35 ",#
+ byte $70, $A9, $62, $54, $E9 ; [10] 36,37 $,%
+ byte $42, $A2, $44, $A0, $D0 ; [15] 38,39 &,'
+ byte $24, $42, $42, $42, $24 ; [20] 40,41 (,)
+ byte $A4, $44, $EE, $44, $A4 ; [25] 42,43 *,+
+ byte $00, $00, $0F, $20, $40 ; [30] 44,45 ,,-
+ byte $02, $02, $04, $08, $48 ; [35] 46,47 .,/
+ byte $64, $9C, $B4, $D4, $6E ; [40] 48,49 0,1
+ byte $6E, $91, $26, $41, $FE ; [45] 50,51 2,3
+ byte $2F, $68, $AE, $F1, $2E ; [50] 52,53 4,5
+ byte $7F, $81, $E2, $94, $64 ; [55] 54,55 6,7
+ byte $66, $99, $67, $91, $6E ; [60] 56,57 8,9
+ byte $00, $42, $00, $02, $44 ; [65] 58,59 :,;
+ byte $20, $4F, $80, $4F, $20 ; [70] 60,61 <,=
+ byte $87, $49, $22, $40, $82 ; [75] 62,63 >,?
+ byte $66, $B9, $BF, $89, $69 ; [80] 64,65 @,A
+ byte $E6, $99, $E8, $99, $E6 ; [85] 66,67 B,C
+ byte $EF, $98, $9E, $98, $EF ; [90] 68,69 D,E
+ byte $F7, $88, $EB, $89, $86 ; [95] 70,71 F,G
+ byte $9E, $94, $F4, $94, $9E ; [100] 72,73 H,I
+ byte $39, $1A, $1C, $9A, $69 ; [105] 74,75 J,K
+ byte $8A, $8F, $8D, $89, $F9 ; [110] 76,77 L,M
+ byte $96, $D9, $B9, $99, $96 ; [115] 78,79 N,O
+ byte $E6, $99, $E9, $8A, $85 ; [120] 80,81 P,Q
+ byte $E7, $98, $E6, $A1, $9E ; [125] 82,83 R,S
+ byte $F9, $49, $49, $49, $46 ; [130] 84,85 T,U
+ byte $99, $99, $9D, $AF, $4A ; [135] 86,87 V,W
+ byte $99, $99, $66, $92, $94 ; [140] 88,89 X,Y
+ byte $F6, $24, $44, $84, $F6 ; [145] 90,91 Z,[
+ byte $86, $82, $42, $22, $26 ; [150] 92,93 \,]
+ byte $40, $A0, $00, $00, $0F ; [155] 94,95 ^,_
+ byte $40, $43, $25, $09, $07 ; [160] 96,97 `,a
+ byte $80, $87, $E8, $98, $E7 ; [165] 98,99 b,c
+ byte $10, $16, $79, $9A, $77 ; [170] 100,101 d,e
+ byte $67, $49, $E7, $41, $46 ; [175] 102,103 f,g
+ byte $84, $80, $EC, $94, $9E ; [180] 104,105 h,i
+ byte $28, $0A, $6C, $2A, $C9 ; [185] 106,107 j,k
+ byte $C0, $4A, $4F, $4D, $E9 ; [190] 108,109 l,m
+ byte $00, $E6, $99, $99, $96 ; [195] 110,111 n,o
+ byte $00, $E7, $99, $E7, $81 ; [200] 112,113 p,q
+ byte $00, $A7, $DC, $83, $8E ; [205] 114,115 r,s
+ byte $40, $E9, $49, $49, $26 ; [210] 116,117 t,u
+ byte $00, $99, $9D, $AF, $4A ; [215] 118,119 v,w
+ byte $00, $99, $66, $62, $9C ; [220] 120,121 x,y
+ byte $06, $F4, $28, $44, $F6 ; [225] 122,123 z,{
+ byte $4C, $44, $42, $44, $4C ; [230] 124,125 |,}
+ byte $0B, $59, $A0, $09, $0D ; [235] 126,127 ~,
diff --git a/src/col64/test.atr b/src/col64/test.atr
new file mode 100644
index 0000000..5e5cd5a
--- /dev/null
+++ b/src/col64/test.atr
Binary files differ
diff --git a/src/col80_modified/Makefile b/src/col80_modified/Makefile
new file mode 100644
index 0000000..4f3a9c6
--- /dev/null
+++ b/src/col80_modified/Makefile
@@ -0,0 +1,15 @@
+
+all: col80_hacked.xex
+
+col80_hacked.xex: col80_hacked.dasm
+ dasm col80_hacked.dasm -ocol80_hacked.xex -f3
+ binload -h col80_hacked.xex
+
+clean:
+ rm -f col80_hacked.xex
+
+test:
+ cp dos_20s.atr test.atr
+ cp col80_hacked.xex autorun.sys
+ axe -w autorun.sys test.atr
+ atari800 -nobasic test.atr
diff --git a/src/col80_modified/autorun.sys b/src/col80_modified/autorun.sys
new file mode 100644
index 0000000..bb432dd
--- /dev/null
+++ b/src/col80_modified/autorun.sys
Binary files differ
diff --git a/src/col80_modified/col80_hacked.dasm b/src/col80_modified/col80_hacked.dasm
new file mode 100644
index 0000000..ef6c5ac
--- /dev/null
+++ b/src/col80_modified/col80_hacked.dasm
@@ -0,0 +1,906 @@
+; THIS IS A MODIFIED VERSION, for use with FujiChat
+
+; COL80.COM, aka COL80E.COM, aka COL80HND.COM
+; (and probably several other names)
+
+; Original author unknown
+; License unknown
+; Disassembly and comments by Urchlay
+
+; This is a widely-distributed software 80-column driver for the Atari
+; 8-bit computers. It replaces the OS's E: driver, and uses GRAPHICS 8
+; for display, with 4x8 pixel character cells.
+
+; Disassembly was done with da65, with many iterations of "edit the
+; .info file, disassemble again", and the results were tweaked by hand
+; into something assemblable by dasm (and fairly compatible with other
+; assemblers).
+
+
+ .processor 6502
+
+START_ADDRESS = $9C2D
+;START_ADDRESS = $7C28 ; works with BASIC
+
+; xex segment header #1
+ .org START_ADDRESS-6
+ .word $FFFF
+ .word START_ADDRESS
+ .word END_ADDRESS
+
+ .org START_ADDRESS
+
+; ----------------------------------------------------------------------------
+; Zero page labels (OS equates)
+
+DOSINI = $000C
+ICAX1Z = $002A
+ICAX2Z = $002B
+TMPCHR = $0050
+LMARGN = $0052
+ROWCRS = $0054
+COLCRS = $0055
+DINDEX = $0057
+SAVMSC = $0058
+BUFCNT = $006B
+
+; ----------------------------------------------------------------------------
+; Zero page labels (COL80 equates)
+
+screen_ptr_lo = $00CB
+screen_ptr_hi = $00CC
+font_ptr_lo = $00CD
+font_ptr_hi = $00CE
+
+; ----------------------------------------------------------------------------
+; Non-zeropage RAM labels (OS equates)
+
+COLOR1 = $02C5
+COLOR2 = $02C6
+RUNAD = $02E0
+INITAD = $02E2
+MEMTOP = $02E5
+SSFLAG = $02FF
+HATABS = $031A
+ICCOM = $0342
+ICBAL = $0344
+ICBAH = $0345
+
+; ----------------------------------------------------------------------------
+; Hardware (memory-mapped I/O, OS equates)
+
+CONSOL = $D01F
+AUDF1 = $D200
+AUDC1 = $D201
+
+; ----------------------------------------------------------------------------
+; OS ROM labels
+
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+CIOV = $E456 ; Central Input/Output entry point
+
+; ----------------------------------------------------------------------------
+; Start of COL80. The font is stored in packed form. Each group of 8 bytes
+; defines two glyphs: the upper 4 bits of the 8 bytes, taken together,
+; define the bitmap for the first glyph, and the lower 4 bits are the second.
+; Note that the bits that make up a single character are spread across 8
+; bytes, so it's hard to visualize these even if you're used to reading hex
+; dumps.
+
+; The first 2 characters look like:
+
+; .... .O.. ; $04
+; .... .O.. ; $04
+; O.O. .O.. ; $A4
+; OOO. .O.. ; $E4
+; OOO. .OOO ; $E7
+; .O.. .O.. ; $44
+; .... .O.. ; $04
+; .... .O.. ; $04
+
+; These are the ATASCII heart symbol (character code 0) and the ATASCII
+; control-A line-drawing symbol (code 1).
+
+; Note: unlike the ROM font, this font is stored in ATASCII order instead
+; of the standard Atari character order imposed by the hardware. Like
+; the ROM font, inverse characters are not stored here (the bitmaps get
+; inverted by the driver)
+
+font_data:
+ .include "new_font.s"
+ ;.include "icetmod.s"
+
+right_margin:
+ ; Default value is 79 decimal. Unsure why the author didn't use RMARGN at $53
+ .byte $4F
+
+; ----------------------------------------------------------------------------
+; Start of COL80 code.
+
+; Callback for CIO OPEN command.
+
+col80_open:
+ jsr init_graphics_8
+ lda #$00
+ sta ROWCRS
+ sta COLCRS
+ sta BUFCNT
+ lda #$4F
+ sta right_margin
+ rts
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08
+ sta ICAX2Z
+ lda #$0C
+ sta ICAX1Z
+ jsr open_s_dev
+
+ ; Set COL80's default colors
+ lda #$08
+ sta COLOR2
+ lda #$00
+ sta COLOR1
+
+ ; Protect ourselves from BASIC and the OS
+ lda #<START_ADDRESS
+ sta MEMTOP
+ lda #>START_ADDRESS
+ sta MEMTOP+1
+ rts
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi
+ pha
+ lda s_dev_open_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; Callback for CIO CLOSE command. Note that the routine does nothing, really
+; (the OS will mark the E: device as being closed, but COL80 doesn't do any
+; cleanup).
+; The SPECIAL and GET STATUS callbacks in col80_vector_tab also point here.
+
+col80_close:
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Callback for the internal put-one-byte, used by the OS to implement the
+; CIO PUT RECORD and PUT BYTES commands. This routine's one argument is
+; the byte in the accumulator (the character to print).
+
+; First, the routine checks for the cursor control characters it supports.
+; COL80 only handles the EOL and clear-screen codes; trying to print
+; backspaces, arrows, deletes, inserts, etc just causes their ATASCII
+; graphics character to print instead.
+
+col80_putbyte:
+ ; EOL (decimal 155)?
+ cmp #$9B
+;;; bne check_clear
+ bne regular_char
+ lda right_margin
+ sta COLCRS
+ jmp skip_write
+
+;;;check_clear:
+;;; .ifndef FUJICHAT ; save memory by not including clear_screen
+;;; ; (also, this lets us print the } character)
+;;; ; Clear (decimal 125)?
+;;; cmp #$7D
+;;; bne regular_char
+;;; jmp clear_screen
+;;; .endif
+;;;
+ ; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax
+ bpl not_inverse
+ lda #$FF
+ sta inverse_mask
+ bne skip_ninv
+
+not_inverse:
+ lda #$00
+ sta inverse_mask
+
+skip_ninv:
+ txa
+ and #$7F
+ ;.ifdef FUJICHAT ; mask out low ASCII
+ sec
+ sbc #$20
+ bcs not_low_ascii
+ jmp return_success
+not_low_ascii:
+ ;.endif
+ sta TMPCHR
+ lda DINDEX
+ cmp #$08
+ beq graphics_ok
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col80_open
+
+graphics_ok:
+ ; Call the routines that actually print the character
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor
+
+check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ ;lda SSFLAG
+ ;bne check_ssflag
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Scroll the screen up one line (8 scanlines). This has to move almost 8K of
+; data, so it's noticeably slower than scrolling the GR.0 text screen.
+
+scroll_screen:
+ lda SAVMSC
+ sta screen_ptr_lo
+ clc
+ adc #$40
+ ; font_ptr_lo is actually being used here as a second pointer into
+ ; screen RAM, instead of its usual use as a pointer into the
+ ; font_data table
+ sta font_ptr_lo
+ lda SAVMSC+1
+ sta screen_ptr_hi
+ adc #$01
+ sta font_ptr_hi
+ ldx #$1D
+ ldy #$00
+
+scroll_line_loop:
+ lda (font_ptr_lo),y
+ sta (screen_ptr_lo),y
+ dey
+ bne scroll_line_loop
+ inc font_ptr_hi
+ inc screen_ptr_hi
+ dex
+ bne scroll_line_loop
+
+blank_bottom_row:
+ lda SAVMSC
+ clc
+ adc #$C0
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ adc #$1C
+ sta screen_ptr_hi
+ lda #$00
+ tay
+
+blank_loop:
+ sta (screen_ptr_lo),y
+ dey
+ bne blank_loop
+ inc screen_ptr_hi
+ ldy #$40
+
+blank_tail:
+ sta (screen_ptr_lo),y
+ dey
+ bpl blank_tail
+ rts
+
+; ----------------------------------------------------------------------------
+; Set up font_ptr_lo/hi to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+setup_font_ptr:
+ lda #$00
+ sta font_ptr_hi
+ sta lo_nybble_flag
+ lda TMPCHR
+ clc
+ ror
+ bcc font_hi_nybble
+ ldx #$FF
+ stx lo_nybble_flag
+
+font_hi_nybble:
+ clc
+ rol
+ rol
+ rol font_ptr_hi
+ rol
+ rol font_ptr_hi
+ adc #<font_data
+ sta font_ptr_lo
+ lda #>font_data
+ adc font_ptr_hi
+ sta font_ptr_hi
+ rts
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS
+ lda right_margin
+ cmp COLCRS
+ bcs same_line
+ lda LMARGN
+ sta COLCRS
+ lda ROWCRS
+ ; $17 is 25 decimal, one row below the lowest on the screen
+ cmp #$17
+ bcc no_scroll
+ jsr scroll_screen
+ ; Move to row 24 after scrolling
+ lda #$16
+ sta ROWCRS
+
+no_scroll:
+ inc ROWCRS
+
+same_line:
+ rts
+
+; ----------------------------------------------------------------------------
+; Clear the screen by setting all screen RAM bytes to zero. Slow, but not
+; as slow as scrolling.
+
+;;; .ifndef FUJICHAT
+;;;clear_screen:
+;;; lda SAVMSC
+;;; sta screen_ptr_lo
+;;; lda SAVMSC+1
+;;; sta screen_ptr_hi
+;;; ldy #$00
+;;; ldx #$1D
+;;; lda #$00
+;;;
+;;;cls_loop:
+;;; sta (screen_ptr_lo),y
+;;; dey
+;;; bne cls_loop
+;;; inc screen_ptr_hi
+;;; dex
+;;; bne cls_loop
+;;; jsr blank_bottom_row
+;;; lda LMARGN
+;;; sta COLCRS
+;;; lda #$00
+;;; sta ROWCRS
+;;; ; redundant JMP
+;;; jmp return_success
+;;; .endif
+
+; ----------------------------------------------------------------------------
+; CIO expects the Y register to contain a status code.
+; 1 means success (no error). Lots of COL80's routines
+; jump here.
+
+return_success:
+ ldy #$01
+ rts
+
+; ----------------------------------------------------------------------------
+; Set screen_ptr_lo/hi to point to the address of the first byte of graphics
+; data at the current cursor position.
+
+setup_screen_ptr:
+ ldy ROWCRS
+ lda SAVMSC
+ clc
+ adc row_low_offset_tab,y
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ adc row_high_offset_tab,y
+ sta screen_ptr_hi
+ lda COLCRS
+ lsr
+ clc
+ adc screen_ptr_lo
+ bcc hi_byte_ok
+ inc screen_ptr_hi
+
+hi_byte_ok:
+ sta screen_ptr_lo
+ rts
+
+; ----------------------------------------------------------------------------
+; Tables of offsets for setup_screen_ptr, to avoid doing multiplication at
+; runtime (the 6502 lacks a MUL instruction, so it's slow...)
+
+row_low_offset_tab:
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+
+row_high_offset_tab:
+ .byte $00,$01,$02,$03,$05,$06,$07,$08
+ .byte $0A,$0B,$0C,$0D,$0F,$10,$11,$12
+ .byte $14,$15,$16,$17,$19,$1A,$1B,$1C
+
+; ----------------------------------------------------------------------------
+; Copy pixel data from the font table to screen RAM.
+; font_ptr_lo/hi must point to the correct character, and screen_ptr_lo/hi
+; must point to the correct screen address for the current cursor position.
+; This routine has separate execution paths for even- and odd-numbered
+; cursor positions, since each byte of screen RAM holds data for two
+; adjacent characters (and when printing to one of them, the other needs
+; to be left undisturbed!)
+
+write_font_data:
+ lda COLCRS
+ clc
+ ror
+ bcc write_font_data_even
+ ldx #$00
+ ldy #$00
+
+get_font_nybble_odd:
+ lda (font_ptr_lo),y
+ bit lo_nybble_flag
+ bne lo_nybble_odd
+ ; glyph we want is stored in top 4 bits of font byte,
+ ; shift it down to the bottom 4 bits
+ lsr
+ lsr
+ lsr
+ lsr
+
+lo_nybble_odd:
+ eor inverse_mask
+ and #$0F
+ sta TMPCHR
+ ldy scanline_offset_tab,x
+ lda (screen_ptr_lo),y
+ and #$F0
+ ora TMPCHR
+ sta (screen_ptr_lo),y
+ inx
+ cpx #$07
+ bne screen_ptr_ok_odd
+ inc screen_ptr_hi
+
+screen_ptr_ok_odd:
+ cpx #$08
+ beq write_font_done_odd
+ txa
+ tay
+ bne get_font_nybble_odd
+
+write_font_done_odd:
+ rts
+
+; ----------------------------------------------------------------------------
+; Write data to even-numbered columns, very similar to the above
+
+write_font_data_even:
+ ldx #$00
+ ldy #$00
+
+get_font_nybble_even:
+ lda (font_ptr_lo),y
+ bit lo_nybble_flag
+ beq hi_nybble_even
+ asl
+ asl
+ asl
+ asl
+
+hi_nybble_even:
+ eor inverse_mask
+ and #$F0
+ sta TMPCHR
+ ldy scanline_offset_tab,x
+ lda (screen_ptr_lo),y
+ and #$0F
+ ora TMPCHR
+ sta (screen_ptr_lo),y
+ inx
+ cpx #$07
+ bne screen_ptr_ok_even
+ inc screen_ptr_hi
+
+screen_ptr_ok_even:
+ cpx #$08
+ beq write_font_done_even
+ txa
+ tay
+ bne get_font_nybble_even
+
+write_font_done_even:
+ rts
+
+; ----------------------------------------------------------------------------
+
+scanline_offset_tab:
+ .byte $00,$28,$50,$78,$A0,$C8,$F0,$18
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL80 maintains a line buffer. Each time col80_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is exactly how the OS E: device works.
+
+col80_getbyte:
+ lda BUFCNT
+ beq get_line
+
+get_next_byte:
+ ldx line_buffer_index
+ lda line_buffer,x
+ dec BUFCNT
+ inc line_buffer_index
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Get a line of input from the user, terminated by the Return key.
+
+get_line:
+ lda #$00
+ sta BUFCNT
+ sta line_buffer_index
+
+show_cursor:
+; .ifdef FUJICHAT
+ lda #$00
+; .else
+; lda #$20
+; .endif
+ sta TMPCHR
+ lda #$FF
+ sta inverse_mask
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+ jsr get_keystroke
+ cpy #$01
+ beq keystroke_ok
+; .ifdef FUJICHAT
+ dey ; yes, we really care about 1-byte optimizations
+; .else
+; ldy #$00
+; .endif
+ sty line_buffer_index
+ sty BUFCNT
+
+keystroke_ok:
+; .ifdef FUJICHAT
+ cmp #$20
+ bcc show_cursor ; ignore low ASCII
+; .endif
+ cmp #$9B
+ bne check_backs_key
+ jmp return_key_hit
+
+check_backs_key:
+ cmp #$7E
+ bne check_clear_key
+ jmp backs_key_hit
+
+check_clear_key:
+ cmp #$7D
+ bne normal_key_hit
+ jmp clear_key_hit
+
+normal_key_hit:
+ ldx BUFCNT
+ bpl buffer_character
+; .ifdef FUJICHAT
+ jmp show_cursor
+; .else
+; jmp beep
+; .endif
+
+buffer_character:
+ sta line_buffer,x
+ jsr col80_putbyte
+ inc BUFCNT
+ jmp show_cursor
+
+return_key_hit:
+ jsr print_space
+ lda #$9B
+ ldx BUFCNT
+ sta line_buffer,x
+ inc BUFCNT
+ jsr col80_putbyte
+ jmp get_next_byte
+
+clear_key_hit:
+; .ifndef FUJICHAT
+; jsr clear_screen
+; .endif
+ lda #$00
+ sta line_buffer_index
+ sta BUFCNT
+ jmp get_line
+
+backs_key_hit:
+ jsr print_space
+ lda BUFCNT
+ beq backs_key_done
+ dec COLCRS
+ lda COLCRS
+ clc
+ adc #$01
+ cmp LMARGN
+ bne backs_same_line
+ lda right_margin
+ sta COLCRS
+ dec ROWCRS
+
+backs_same_line:
+ dec BUFCNT
+
+backs_key_done:
+ jmp show_cursor
+
+; ----------------------------------------------------------------------------
+; Ring the margin bell. COL80 doesn't implement the ctrl-2 bell (character
+; 253), and instead of using the GTIA keyclick speaker, it uses POKEY to
+; make a beep
+
+;;; .ifndef FUJICHAT
+;;;beep: ldy #$00
+;;; ldx #$AF
+;;;
+;;;beep_delay_x:
+;;; stx AUDF1
+;;; stx AUDC1
+;;;
+;;;beep_delay_y:
+;;; dey
+;;; bne beep_delay_y
+;;; dex
+;;; cpx #$9F
+;;; bne beep_delay_x
+;;; jmp show_cursor
+;;; .endif
+
+; ----------------------------------------------------------------------------
+; Print a space character at the current cursor position. Does not
+; update the cursor position.
+print_space:
+ lda #$00
+ sta inverse_mask
+;;; .ifndef FUJICHAT
+;;; lda #$20
+;;; .endif
+ sta TMPCHR
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+ rts
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+get_keystroke:
+ lda k_dev_get_hi
+ pha
+ lda k_dev_get_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; COL80 vector table, in the format required by the OS. Our HATABS entry
+; will point to this table, and the OS will call the routines listed here
+; via the "call by RTS" method (which is why they're address-minus-one).
+
+; See the entry on HATABS in "Mapping the Atari" or the OS manual.
+
+col80_vector_tab:
+ .word col80_open-1
+ .word col80_close-1
+ .word col80_getbyte-1
+ .word col80_putbyte-1
+ .word col80_close-1
+ .word col80_close-1
+ jmp col80_init
+
+END_ADDRESS = *-1
+
+START_ADDRESS_2 = $03FD
+
+; xex segment header #2
+ .word START_ADDRESS_2
+ .word END_ADDRESS_2
+
+ .rorg START_ADDRESS_2
+
+; ----------------------------------------------------------------------------
+; Various bits of runtime state here. It's unclear to me why the standard
+; OS buffer location couldn't have been used instead (normally the top
+; half of page 5), or why the other stuff couldn't have been stored in
+; zero page, in locations used by the ROM E: handler (thus unused when
+; it's replaced with COL80). line_buffer_index needs to be preserved
+; across calls to col80_getbyte, but lo_nybble_flag and inverse_mask are
+; freshly calculated every time they're used, so they could be almost
+; anywhere.
+
+lo_nybble_flag:
+ .byte $00
+
+inverse_mask:
+ .byte $00
+
+line_buffer_index:
+ .byte $12
+
+
+; ----------------------------------------------------------------------------
+; Initialization callback. The OS will call this on coldstart (or would do,
+; if the driver were in ROM), and also on warmstart (because we stole the
+; DOSINI vector).
+; This routine is also the first thing that gets called by the mainline
+; init code. Its job is to install COL80 in the handler table at HATABS.
+; Actually the handler is first installed as X:, then the main init code
+; fixes this up to E: unless the user is holding down SELECT. This allows
+; the user to toggle between the 40-column ROM E: and COL80 without doing
+; a full reboot. No idea if this was a documented feature or something the
+; author used for development/debugging.
+
+; .ifdef FUJICHAT
+;col80_init = return_success
+; .else
+col80_init:
+ ldy #$00
+
+next_hatab_slot:
+ lda HATABS,y
+ beq register_x_handler
+ iny
+ iny
+ iny
+ cpy #$20
+ bcc next_hatab_slot
+ jmp return_success
+
+register_x_handler:
+ lda #$58
+ sta HATABS,y
+ lda #<col80_vector_tab
+ iny
+ sta HATABS,y
+ lda #>col80_vector_tab
+ iny
+ sta HATABS,y
+ jmp return_success
+; .endif
+
+; ----------------------------------------------------------------------------
+; The OS jumps here on warmstart (also, this is the run address in our
+; binary load file)
+
+dosini_entry_point:
+;;; .ifndef FUJICHAT
+;;; nop
+;;; nop
+;;; nop
+;;; .endif
+
+main_entry_point:
+;;; .ifndef FUJICHAT
+ jsr col80_init
+;;; lda CONSOL
+;;; and #$04
+;;; beq no_e_handler
+;;; .endif
+ lda #$0C
+ sta ICCOM
+ ldx #$00
+ jsr CIOV
+; .ifndef FUJICHAT ; note: will not work with BASIC! DOS/etc OK
+ lda #$58
+ sta font_ptr_lo
+ lda #$03
+ sta ICCOM
+ lda #font_ptr_lo
+ sta ICBAL
+ lda #$00
+ sta ICBAH
+ ldx #$00
+ jsr CIOV
+; .endif
+ ldy #$07
+ lda #<col80_vector_tab
+ sta HATABS,y
+ lda #>col80_vector_tab
+ iny
+ sta HATABS,y
+no_e_handler:
+ lda #<START_ADDRESS
+ sta MEMTOP
+ lda #>START_ADDRESS
+ sta MEMTOP+1
+ jmp return_success
+
+END_ADDRESS_2 = *-1
+
+; xex segment header #3
+ ;.word RUNAD
+ ;.word RUNAD+1
+ .word INITAD
+ .word INITAD+1
+ .word main_entry_point
+
+; ----------------------------------------------------------------------------
+; (when does this actually get called? da65 can't find any references
+; to it, and it's not a run or init address in the binary load file)
+;;; .ifndef FUJICHAT
+;;; lda #<dosini_entry_point
+;;; sta DOSINI
+;;; lda #>dosini_entry_point
+;;; sta DOSINI+1
+;;; jmp main_entry_point
+;;; .endif
+
+; ----------------------------------------------------------------------------
+; There's absolutely no reason why this data needs to be included in the
+; binary load file: the line buffer's initial contents are meaningless, they
+; will be blown away the first time anything reads from the E: device.
+
+; Notice the author was running his debugger in COL80 when he built the
+; binary (ASCII "S COL80 7A00 7F80" command still in the buffer).
+
+ ;.ifdef FUJICHAT
+
+line_buffer = $0400 ; cassette buffer
+
+ ;.else
+;line_buffer:
+ ;.byte $53,$20,$43,$4F,$4C,$38,$30,$20
+ ;.byte $37,$41,$30,$30,$20,$37,$46,$38
+ ;.byte $30,$9B,$20,$20,$20,$20,$9B,$27
+ ;.byte $40,$40,$40,$40,$28,$28,$28,$28
+ ;.byte $40,$40,$40,$40,$40,$40,$40,$40
+ ;.byte $40,$40,$40,$40,$40,$40,$40,$40
+ ;.byte $9B,$FD,$FD,$FD,$FD,$9B
+ ;.endif
+
+
+; I've found a variant (modified version?) of this code, that doesn't
+; include the line_buffer in the file (no reason for it to be there),
+; or the $0C segment, and that has another segment, loaded at $6000,
+; with the run address changed to $6000. The code looks like:
+
+; .org $6000
+; jsr dosini_entry_point
+; lda #$50
+; sta RMARGN
+; lda #$00
+; sta COLOR2
+
+; also, the default colors have been changed in init_graphics_8.
+
+; There are at least two binaries floating around that contain
+; extra (garbage) bytes at the end, presumably from being transferred
+; over XMODEM or similar. They are otherwise identical.
+
diff --git a/src/col80_modified/col80_hacked.xex b/src/col80_modified/col80_hacked.xex
new file mode 100644
index 0000000..73ac7e3
--- /dev/null
+++ b/src/col80_modified/col80_hacked.xex
Binary files differ
diff --git a/src/col80_modified/cruft/Makefile b/src/col80_modified/cruft/Makefile
new file mode 100644
index 0000000..2152ced
--- /dev/null
+++ b/src/col80_modified/cruft/Makefile
@@ -0,0 +1,45 @@
+
+SRCFILES=col80_dosini_seg.s col80_header_seg.s col80_main.s \
+ col80_runad_seg.s col80_startaddr.s
+
+all: cc65_hack
+ binload -h col80.xex
+
+cc65_hack: $(SRCFILES) col80.s
+ ca65 -t atari -DFUJICHAT col80.s
+ ld65 -C col80_cc65_hack.cfg -o col80_main.xex col80.o
+ ca65 -t atari -DFUJICHAT col80_startup.s
+ ld65 -o col80_startup.xex col80_startup.o
+ cat col80_main.xex col80_startup.xex > col80.xex
+
+
+col80.xex:
+ $(MAKE) dasm_build || $(MAKE) ca65_build || $(MAKE) atasm_build
+
+dasm_build: $(SRCFILES) col80.dasm
+ dasm col80.dasm -f3 -ocol80.xex
+
+ca65_build: $(SRCFILES) col80.s
+ ca65 -t atari col80.s
+ ld65 -t atari -o col80.xex col80.o
+
+atasm_build: $(SRCFILES) col80.atasm
+ perl dasm2atasm col80_header_seg.s col80_header_seg.atasm
+ perl dasm2atasm col80_main.s col80_main.atasm
+ atasm -r -ocol80.xex col80.atasm
+
+check: col80.xex
+ @if cmp col80.xex col80_orig.xex; then \
+ echo "OK: New binary is identical to original" ;\
+ else \
+ echo "BAD: New binary differs from original" ;\
+ fi
+
+clean:
+ rm -f *.o col80_header_seg.atasm col80_main.atasm col80.xex
+
+test:
+ cp dos_20s.atr test.atr
+ cp col80.xex autorun.sys
+ axe -w autorun.sys test.atr
+ atari800 -nobasic test.atr
diff --git a/src/col80_modified/cruft/README.txt b/src/col80_modified/cruft/README.txt
new file mode 100644
index 0000000..720a1cc
--- /dev/null
+++ b/src/col80_modified/cruft/README.txt
@@ -0,0 +1,89 @@
+
+COL80 is a software 80-column driver for the Atari 8-bit computer. It
+uses GRAPHICS 8 with 4x8 pixel character cells, and replaces the OS
+ROM's E: handler.
+
+The file is found in various Atari archives, under various names such
+as COL80.COM, COL80E.COM, COL80HND.COM. The original author and date of
+publication are unknown.
+
+I've disassembled the binary and labelled/commented the source with
+(hopefully) meaningful names. The resulting sources can be reassembled
+with the DASM, ca65, or Atasm assemblers, which will result in a binary
+that compares as identical to the original.
+
+If you have one of the supported assemblers available on your path,
+plus a "make" utility (GNU, BSD, or probably Microsoft's nmake are OK),
+you can use the provided Makefile to rebuild the binary (including your
+own modified version, if you're into that sort of thing).
+
+File list:
+
+README.txt - you're reading it now
+
+Makefile - the usual
+
+col80_main.s - The actual source code for COL80
+
+col80_dosini_seg.s, col80_header_seg.s, col80_runad_seg.s, and
+col80_startaddr.s - Include files, used to build the multi-segment Atari
+binary load format object file.
+
+col80.s, col80.dasm, col80.atasm - Top-level wrappers for the various
+assemblers, which include the other files in the proper order and using
+the proper syntax for the assembler being used.
+
+Modification Ideas:
+
+Implement the missing control character actions. COL80 only does EOL and
+the clear-screen code (125), and the others (arrows, delete/insert/bell)
+are just printed in their graphical form.
+
+The original COL80 loads the driver code at $7A00, so it'll be compatible
+with BASIC, or other cartridge software. I've built a version org'ed at
+$9A00, which works great with disk-only software and gives an extra 8K
+of available RAM (change START_ADDR in col80_startaddr.s).
+
+It should be possible to use 4x7 or 4x6 character cells instead of
+4x8. The font would of course need to be redesigned, and the characters
+would be even smaller than they are now, but this would give you 27 or
+32 rows of text on screen (or more, if you expand the display by a few
+scanlines). With a good green or amber monitor and luma-only output,
+this could be usable.
+
+Instead of inverse video for characters 128-255, could do an expanded
+international character set (ISO Latin-1). Add a UTF-8 parser and you've
+got Unicode on the Atari!
+
+Add a VT100/ANSI escape-sequence parser. Could render actual underlined
+characters, and bold as inverse video. ANSI color codes we can't easily
+do, but could at least strip them out.
+
+Squeeze the driver down to save RAM. Use the standard E: buffer in page 5,
+move the code up so it ends just before the GR.8 display list, eliminate
+the code that installs the handler as X: and checks for the SELECT key
+being held down... get rid of the margin beep. Use RMARGN in zero page
+instead of right_margin at $7C00, move the other COL80 variables to
+page zero. Eliminate the lookup tables, if they can be replaced with
+code that takes up less space and calculates the values on the fly.
+The current driver code is 3 pages long; it might be possible to squish
+it into 2 pages... like, say, page 6 and the cassette buffer, or make it
+auto-relocate itself to MEMLO like Bob-Verter does. Using a 4x6 or 4x7
+font shrinks the font table, too... another thing to do would be to get
+rid of the clear_screen routine (replace with a call to init_graphics_8)
+
+For XL/XE machines, turn COL80 into an OS patch. For modified 400/800
+machines with RAM at $C000-CFFF, move COL80 there. For 130XEs, use an
+extended RAM bank for the driver, and another bank for the screen RAM
+(separate ANTIC/CPU access mode, won't work on most upgraded 800XLs). Just
+keep a tiny stub driver in main RAM, that switches in the driver's bank
+and jumps to it.
+
+Make a COL64 driver (like the SpartaDOS X CON64.SYS). Use 5x8 characters
+for 64 columns (or 5x6 for 64x32). Probably this would count more as
+a rewrite than a modification. The font would have to be stored one
+character per 8 bytes (take up twice as much space), and lots of shifting
+would have to happen when writing to the screen (slow)... Could also
+do 56 columns (7 pixel wide), and actually use the ROM font (just cut
+off the high bit, and for 56x27 also cut off the bottom scanline).
+
diff --git a/src/col80_modified/cruft/autorun.sys b/src/col80_modified/cruft/autorun.sys
new file mode 100644
index 0000000..e62d76d
--- /dev/null
+++ b/src/col80_modified/cruft/autorun.sys
Binary files differ
diff --git a/src/col80_modified/cruft/col80.atasm b/src/col80_modified/cruft/col80.atasm
new file mode 100644
index 0000000..3fdd27a
--- /dev/null
+++ b/src/col80_modified/cruft/col80.atasm
@@ -0,0 +1,6 @@
+
+ .include "col80_startaddr.s"
+ .include "col80_header_seg.atasm"
+ .include "col80_main.atasm"
+ .include "col80_dosini_seg.s"
+ .include "col80_runad_seg.s"
diff --git a/src/col80_modified/cruft/col80.dasm b/src/col80_modified/cruft/col80.dasm
new file mode 100644
index 0000000..b3a1de2
--- /dev/null
+++ b/src/col80_modified/cruft/col80.dasm
@@ -0,0 +1,10 @@
+
+ processor 6502 ; dasm
+
+ .include col80_startaddr.s
+ .include col80_header_seg.s
+ .include col80_main.s
+ .include col80_dosini_seg.s
+
+ .include col80_runad_seg.s
+
diff --git a/src/col80_modified/cruft/col80.info b/src/col80_modified/cruft/col80.info
new file mode 100644
index 0000000..ad821a4
--- /dev/null
+++ b/src/col80_modified/cruft/col80.info
@@ -0,0 +1,152 @@
+global {
+ comments 4;
+ inputname "col80e.raw";
+ outputname "col80e.dasm";
+ startaddr $7A00;
+};
+
+range {
+ start $7A00;
+ end $7BFF;
+ type bytetable;
+};
+
+range {
+ start $7F48;
+ end $7F80;
+ type bytetable;
+};
+
+range {
+ start $7D52;
+ end $7D81;
+ type bytetable;
+};
+
+range {
+ start $7DEA;
+ end $7DF0;
+ type bytetable;
+};
+
+range {
+ start $7EE5;
+ end $7EF0;
+ type addrtable;
+};
+
+LABEL { NAME "s_dev_open_lo"; ADDR $E410; };
+LABEL { NAME "s_dev_open_hi"; ADDR $E411; };
+
+LABEL { NAME "k_dev_get_lo"; ADDR $E424; };
+LABEL { NAME "k_dev_get_hi"; ADDR $E425; };
+
+LABEL { NAME "DOSINI"; ADDR $0C; };
+LABEL { NAME "DOSINI+1"; ADDR $0D; };
+LABEL { NAME "TMPCHR"; ADDR $50; };
+LABEL { NAME "LMARGN"; ADDR $52; };
+LABEL { NAME "DINDEX"; ADDR $57; };
+LABEL { NAME "SAVMSC"; ADDR $58; };
+LABEL { NAME "SAVMSC+1"; ADDR $59; };
+LABEL { NAME "ICAX1Z"; ADDR $2A; };
+LABEL { NAME "ICAX2Z"; ADDR $2B; };
+LABEL { NAME "ROWCRS"; ADDR $54; };
+LABEL { NAME "COLCRS"; ADDR $55; };
+LABEL { NAME "BUFCNT"; ADDR $6B; };
+LABEL { NAME "SSFLAG"; ADDR $02FF; };
+LABEL { NAME "HATABS"; ADDR $031A; };
+LABEL { NAME "CIOV"; ADDR $E456; };
+LABEL { NAME "CONSOL"; ADDR $D01F; };
+LABEL { NAME "AUDF1"; ADDR $D200; };
+LABEL { NAME "AUDC1"; ADDR $D201; };
+LABEL { NAME "ICCOM"; ADDR $0342; };
+LABEL { NAME "ICBAL"; ADDR $0344; };
+LABEL { NAME "ICBAH"; ADDR $0345; };
+LABEL { NAME "COLOR1"; ADDR $02C5; };
+LABEL { NAME "COLOR2"; ADDR $02C6; };
+LABEL { NAME "MEMTOP"; ADDR $02E5; };
+LABEL { NAME "MEMTOP+1"; ADDR $02E6; };
+
+LABEL { NAME "col80e_vector_tab"; ADDR $7EE5; };
+LABEL { NAME "col80e_open-1"; ADDR $7C00; };
+LABEL { NAME "col80e_open"; ADDR $7C01; };
+LABEL { NAME "col80e_close-1"; ADDR $7C3F; };
+LABEL { NAME "col80e_close"; ADDR $7C40; };
+LABEL { NAME "col80e_getbyte-1"; ADDR $7DF1; };
+LABEL { NAME "col80e_getbyte"; ADDR $7DF2; };
+LABEL { NAME "col80e_putbyte-1"; ADDR $7C42; };
+LABEL { NAME "col80e_putbyte"; ADDR $7C43; };
+LABEL { NAME "col80e_init"; ADDR $7EC0; };
+
+LABEL { NAME "screen_ptr_lo"; ADDR $CB; };
+LABEL { NAME "screen_ptr_hi"; ADDR $CC; };
+LABEL { NAME "font_ptr_lo"; ADDR $CD; };
+LABEL { NAME "font_ptr_hi"; ADDR $CE; };
+
+LABEL { NAME "font_data"; ADDR $7A00; };
+LABEL { NAME "lo_nybble_flag"; ADDR $7F48; };
+
+LABEL { NAME "clear_screen"; ADDR $7D0B; };
+LABEL { NAME "regular_char"; ADDR $7C56; };
+LABEL { NAME "check_ssflag"; ADDR $7C7F; };
+LABEL { NAME "dosini_entry_point"; ADDR $7EF4; };
+LABEL { NAME "main_entry_point"; ADDR $7EF7; };
+LABEL { NAME "get_keystroke"; ADDR $7EB7; };
+LABEL { NAME "return_success"; ADDR $7D31; };
+LABEL { NAME "inverse_mask"; ADDR $7F49; };
+LABEL { NAME "not_inverse"; ADDR $7C60; };
+LABEL { NAME "open_s_dev"; ADDR $7C37; };
+LABEL { NAME "init_graphics_8"; ADDR $7C14; };
+LABEL { NAME "not_eol"; ADDR $7C4F; };
+LABEL { NAME "graphics_ok"; ADDR $7C73; };
+LABEL { NAME "setup_screen_ptr"; ADDR $7D34; };
+LABEL { NAME "setup_font_ptr"; ADDR $7CC9; };
+LABEL { NAME "hi_byte_ok"; ADDR $7D4F; };
+LABEL { NAME "row_low_offset_tab"; ADDR $7D52; };
+LABEL { NAME "row_high_offset_tab"; ADDR $7D6A; };
+LABEL { NAME "cls_loop"; ADDR $7D19; };
+LABEL { NAME "write_font_data_odd"; ADDR $7D82; };
+LABEL { NAME "write_font_data_even"; ADDR $7DB9; };
+LABEL { NAME "scroll_screen"; ADDR $7C87; };
+LABEL { NAME "advance_cursor"; ADDR $7CEE; };
+LABEL { NAME "skip_write"; ADDR $7C7C; };
+LABEL { NAME "skip_ninv"; ADDR $7C65; };
+LABEL { NAME "lo_nybble_odd"; ADDR $7D97; };
+LABEL { NAME "hi_nybble_even"; ADDR $7DC8; };
+LABEL { NAME "write_font_done_odd"; ADDR $7DB8; };
+LABEL { NAME "get_font_nybble_odd"; ADDR $7D8C; };
+LABEL { NAME "get_font_nybble_even"; ADDR $7DBD; };
+LABEL { NAME "screen_ptr_ok_odd"; ADDR $7DB0; };
+LABEL { NAME "screen_ptr_ok_even"; ADDR $7DE1; };
+LABEL { NAME "write_font_done_even"; ADDR $7DE9; };
+LABEL { NAME "scanline_offset_tab"; ADDR $7DEA; };
+LABEL { NAME "get_line"; ADDR $7E04; };
+LABEL { NAME "line_buffer_index"; ADDR $7F4A; };
+LABEL { NAME "line_buffer"; ADDR $7F4B; };
+LABEL { NAME "get_next_byte"; ADDR $7DF6; };
+LABEL { NAME "show_cursor"; ADDR $7E0B; };
+LABEL { NAME "keystroke_ok"; ADDR $7E2B; };
+LABEL { NAME "return_key_hit"; ADDR $7E52; };
+LABEL { NAME "check_backs_key"; ADDR $7E32; };
+LABEL { NAME "backs_key_hit"; ADDR $7E71; };
+LABEL { NAME "check_clear_key"; ADDR $7E39; };
+LABEL { NAME "clear_key_hit"; ADDR $7E64; };
+LABEL { NAME "normal_key_hit"; ADDR $7E40; };
+LABEL { NAME "beep"; ADDR $7E8F; };
+LABEL { NAME "beep_delay_x"; ADDR $7E93; };
+LABEL { NAME "beep_delay_y"; ADDR $7E99; };
+LABEL { NAME "buffer_character"; ADDR $7E47; };
+LABEL { NAME "print_space"; ADDR $7EA4; };
+LABEL { NAME "backs_key_done"; ADDR $7E8C; };
+LABEL { NAME "same_line"; ADDR $7E8A; };
+LABEL { NAME "next_hatab_slot"; ADDR $7EC2; };
+LABEL { NAME "register_x_handler"; ADDR $7ED1; };
+LABEL { NAME "no_e_handler"; ADDR $7F30; };
+LABEL { NAME "no_scroll"; ADDR $7D08; };
+LABEL { NAME "next_line"; ADDR $7D0A; };
+LABEL { NAME "font_hi_nybble"; ADDR $7CDB; };
+LABEL { NAME "scroll_line_loop"; ADDR $7C9C; };
+LABEL { NAME "blank_bottom_row"; ADDR $7CAA; };
+LABEL { NAME "blank_loop"; ADDR $7CBA; };
+LABEL { NAME "blank_tail"; ADDR $7CC3; };
+
diff --git a/src/col80_modified/cruft/col80.s b/src/col80_modified/cruft/col80.s
new file mode 100644
index 0000000..334082a
--- /dev/null
+++ b/src/col80_modified/cruft/col80.s
@@ -0,0 +1,21 @@
+
+; ca65 wrapper for building col80
+
+ .setcpu "6502"
+
+ .segment "EXEHDR"
+ .include "col80_startaddr.s"
+ .include "col80_header_seg.s"
+
+ .segment "CODE"
+ .include "col80_main.s"
+
+ .ifndef FUJICHAT
+ .include "col80_dosini_seg.s"
+
+ .segment "AUTOSTRT"
+ .include "col80_runad_seg.s"
+ .endif
+
+ .segment "ZPSAVE"
+ ; nothing to see here, just shutting up ld65's warning
diff --git a/src/col80_modified/cruft/col80.xex b/src/col80_modified/cruft/col80.xex
new file mode 100644
index 0000000..5872c7f
--- /dev/null
+++ b/src/col80_modified/cruft/col80.xex
Binary files differ
diff --git a/src/col80_modified/cruft/col80_cc65_hack.cfg b/src/col80_modified/cruft/col80_cc65_hack.cfg
new file mode 100644
index 0000000..82b2c25
--- /dev/null
+++ b/src/col80_modified/cruft/col80_cc65_hack.cfg
@@ -0,0 +1,41 @@
+FEATURES {
+ STARTADDRESS: default = $2E00;
+}
+SYMBOLS {
+ __STACKSIZE__ = $800; # 2K stack
+ __RESERVED_MEMORY__: value = $0, weak = yes;
+}
+MEMORY {
+ ZP: start = $0082, size = $007E, type = rw, define = yes;
+ HEADER: start = $0000, size = $0006, file = %O;
+ RAM: start = %S, size = $BC20 - __STACKSIZE__ - %S, file = %O;
+ TRAILER: start = $0000, size = $0006, file = %O;
+}
+SEGMENTS {
+ EXEHDR: load = HEADER, type = ro;
+ LOWCODE: load = RAM, type = ro, define = yes, optional = yes;
+ INIT: load = RAM, type = ro, optional = yes;
+ CODE: load = RAM, type = ro, define = yes;
+ RODATA: load = RAM, type = ro;
+ DATA: load = RAM, type = rw;
+ ZPSAVE: load = RAM, type = bss, define = yes;
+ BSS: load = RAM, type = bss, define = yes;
+ HEAP: load = RAM, type = bss, optional = yes; # must sit just below stack
+ ZEROPAGE: load = ZP, type = zp, optional = yes;
+ EXTZP: load = ZP, type = zp, optional = yes;
+ AUTOSTRT: load = TRAILER, type = ro, optional = yes;
+}
+FEATURES {
+ CONDES: segment = INIT,
+ type = constructor,
+ label = __CONSTRUCTOR_TABLE__,
+ count = __CONSTRUCTOR_COUNT__;
+ CONDES: segment = RODATA,
+ type = destructor,
+ label = __DESTRUCTOR_TABLE__,
+ count = __DESTRUCTOR_COUNT__;
+ CONDES: type = interruptor,
+ segment = RODATA,
+ label = __INTERRUPTOR_TABLE__,
+ count = __INTERRUPTOR_COUNT__;
+}
diff --git a/src/col80_modified/cruft/col80_dosini_seg.s b/src/col80_modified/cruft/col80_dosini_seg.s
new file mode 100644
index 0000000..d92e7ed
--- /dev/null
+++ b/src/col80_modified/cruft/col80_dosini_seg.s
@@ -0,0 +1,12 @@
+
+; Second segment of the file loads at $0C (aka DOSINI), and just contains
+; the address of dosini_entry_point
+
+ .ifndef FUJICHAT
+ .word $FFFF ; unnecessary, though the original file had it
+ .endif
+
+ .word $000C ; DOSINI
+ .word $000D
+ .word dosini_entry_point
+
diff --git a/src/col80_modified/cruft/col80_entry.s b/src/col80_modified/cruft/col80_entry.s
new file mode 100644
index 0000000..edf0d96
--- /dev/null
+++ b/src/col80_modified/cruft/col80_entry.s
@@ -0,0 +1,61 @@
+; ----------------------------------------------------------------------------
+; The OS jumps here on warmstart (also, this is the run address in our
+; binary load file)
+
+dosini_entry_point:
+ .ifndef FUJICHAT
+ nop
+ nop
+ nop
+ .endif
+
+main_entry_point:
+ jsr col80_init
+ .ifndef FUJICHAT
+ lda CONSOL
+ and #$04
+ beq no_e_handler
+ .endif
+ lda #$0C
+ sta ICCOM
+ ldx #$00
+ jsr CIOV
+ lda #$58
+ sta font_ptr_lo
+ lda #$03
+ sta ICCOM
+ lda #font_ptr_lo
+ sta ICBAL
+ lda #$00
+ sta ICBAH
+ ldx #$00
+ jsr CIOV
+ ldy #$07
+ lda #<col80_vector_tab
+ sta HATABS,y
+ lda #>col80_vector_tab
+ iny
+ sta HATABS,y
+no_e_handler:
+ lda #<START_ADDRESS
+ sta MEMTOP
+ lda #>START_ADDRESS
+ sta MEMTOP+1
+ .ifdef FUJICHAT
+ ldy #$01
+ rts
+ .else
+ jmp return_success
+ .endif
+
+; ----------------------------------------------------------------------------
+; (when does this actually get called? da65 can't find any references
+; to it, and it's not a run or init address in the binary load file)
+ .ifndef FUJICHAT
+ lda #<dosini_entry_point
+ sta DOSINI
+ lda #>dosini_entry_point
+ sta DOSINI+1
+ jmp main_entry_point
+ .endif
+
diff --git a/src/col80_modified/cruft/col80_header_seg.s b/src/col80_modified/cruft/col80_header_seg.s
new file mode 100644
index 0000000..2f96ad9
--- /dev/null
+++ b/src/col80_modified/cruft/col80_header_seg.s
@@ -0,0 +1,6 @@
+
+ .org START_ADDRESS-6
+ .word $FFFF
+ .word START_ADDRESS
+ .word END_ADDRESS
+
diff --git a/src/col80_modified/cruft/col80_include.s b/src/col80_modified/cruft/col80_include.s
new file mode 100644
index 0000000..943c579
--- /dev/null
+++ b/src/col80_modified/cruft/col80_include.s
@@ -0,0 +1,50 @@
+; ----------------------------------------------------------------------------
+; Zero page labels (OS equates)
+
+DOSINI = $000C
+ICAX1Z = $002A
+ICAX2Z = $002B
+TMPCHR = $0050
+LMARGN = $0052
+ROWCRS = $0054
+COLCRS = $0055
+DINDEX = $0057
+SAVMSC = $0058
+BUFCNT = $006B
+
+; ----------------------------------------------------------------------------
+; Zero page labels (COL80 equates)
+
+screen_ptr_lo = $00CB
+screen_ptr_hi = $00CC
+font_ptr_lo = $00CD
+font_ptr_hi = $00CE
+
+; ----------------------------------------------------------------------------
+; Non-zeropage RAM labels (OS equates)
+
+COLOR1 = $02C5
+COLOR2 = $02C6
+RUNAD = $02E0
+MEMTOP = $02E5
+SSFLAG = $02FF
+HATABS = $031A
+ICCOM = $0342
+ICBAL = $0344
+ICBAH = $0345
+
+; ----------------------------------------------------------------------------
+; Hardware (memory-mapped I/O, OS equates)
+
+CONSOL = $D01F
+AUDF1 = $D200
+AUDC1 = $D201
+
+; ----------------------------------------------------------------------------
+; OS ROM labels
+
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+CIOV = $E456 ; Central Input/Output entry point
diff --git a/src/col80_modified/cruft/col80_init.s b/src/col80_modified/cruft/col80_init.s
new file mode 100644
index 0000000..89ccf75
--- /dev/null
+++ b/src/col80_modified/cruft/col80_init.s
@@ -0,0 +1,35 @@
+; ----------------------------------------------------------------------------
+; Initialization callback. The OS will call this on coldstart (or would do,
+; if the driver were in ROM), and also on warmstart (because we stole the
+; DOSINI vector).
+; This routine is also the first thing that gets called by the mainline
+; init code. Its job is to install COL80 in the handler table at HATABS.
+; Actually the handler is first installed as X:, then the main init code
+; fixes this up to E: unless the user is holding down SELECT. This allows
+; the user to toggle between the 40-column ROM E: and COL80 without doing
+; a full reboot. No idea if this was a documented feature or something the
+; author used for development/debugging.
+
+col80_init:
+ ldy #$00
+
+next_hatab_slot:
+ lda HATABS,y
+ beq register_x_handler
+ iny
+ iny
+ iny
+ cpy #$20
+ bcc next_hatab_slot
+ jmp return_success
+
+register_x_handler:
+ lda #$58
+ sta HATABS,y
+ lda #<col80_vector_tab
+ iny
+ sta HATABS,y
+ lda #>col80_vector_tab
+ iny
+ sta HATABS,y
+ jmp return_success
diff --git a/src/col80_modified/cruft/col80_main.s b/src/col80_modified/cruft/col80_main.s
new file mode 100644
index 0000000..0ced210
--- /dev/null
+++ b/src/col80_modified/cruft/col80_main.s
@@ -0,0 +1,824 @@
+; THIS IS A MODIFIED VERSION, for use with FujiChat
+
+; COL80.COM, aka COL80E.COM, aka COL80HND.COM
+; (and probably several other names)
+
+; Original author unknown
+; License unknown
+; Disassembly and comments by Urchlay
+
+; This is a widely-distributed software 80-column driver for the Atari
+; 8-bit computers. It replaces the OS's E: driver, and uses GRAPHICS 8
+; for display, with 4x8 pixel character cells.
+
+; Disassembly was done with da65, with many iterations of "edit the
+; .info file, disassemble again", and the results were tweaked by hand
+; into something assemblable by dasm (and fairly compatible with other
+; assemblers).
+
+
+ .include "col80_include.s"
+
+; START_ADDRESS is defined in col80_startaddr.s
+ .org START_ADDRESS
+
+; ----------------------------------------------------------------------------
+; Start of COL80. The font is stored in packed form. Each group of 8 bytes
+; defines two glyphs: the upper 4 bits of the 8 bytes, taken together,
+; define the bitmap for the first glyph, and the lower 4 bits are the second.
+; Note that the bits that make up a single character are spread across 8
+; bytes, so it's hard to visualize these even if you're used to reading hex
+; dumps.
+
+; The first 2 characters look like:
+
+; .... .O.. ; $04
+; .... .O.. ; $04
+; O.O. .O.. ; $A4
+; OOO. .O.. ; $E4
+; OOO. .OOO ; $E7
+; .O.. .O.. ; $44
+; .... .O.. ; $04
+; .... .O.. ; $04
+
+; These are the ATASCII heart symbol (character code 0) and the ATASCII
+; control-A line-drawing symbol (code 1).
+
+; Note: unlike the ROM font, this font is stored in ATASCII order instead
+; of the standard Atari character order imposed by the hardware. Like
+; the ROM font, inverse characters are not stored here (the bitmaps get
+; inverted by the driver)
+
+font_data:
+ .ifdef FUJICHAT
+ .include "new_font.s"
+ .else
+ ; Low ATASCII graphics symbols (code 0-31)
+ .byte $04,$04,$A4,$E4,$E7,$44,$04,$04
+ .byte $14,$14,$14,$14,$1C,$10,$10,$10
+ .byte $40,$40,$40,$40,$CC,$44,$44,$44
+ .byte $18,$18,$24,$24,$42,$42,$81,$81
+ .byte $10,$10,$30,$30,$73,$73,$F3,$F3
+ .byte $83,$83,$C3,$C3,$E0,$E0,$F0,$F0
+ .byte $CF,$CF,$C0,$C0,$00,$00,$00,$00
+ .byte $00,$00,$00,$00,$0C,$0C,$FC,$FC
+ .byte $00,$00,$00,$40,$A7,$44,$E4,$04
+ .byte $04,$04,$04,$04,$FF,$04,$04,$04
+ .byte $00,$00,$60,$F0,$FF,$6F,$0F,$0F
+ .byte $80,$80,$80,$80,$8F,$84,$84,$84
+ .byte $4C,$4C,$4C,$4C,$FC,$0C,$0C,$0C
+ .byte $40,$4C,$48,$4C,$78,$0C,$06,$00
+ .byte $00,$44,$E4,$44,$4E,$44,$00,$00
+ .byte $00,$24,$42,$FF,$42,$24,$00,$00
+
+ ; Space ! " # etc (codes 32-63)
+ .byte $00,$04,$04,$04,$04,$00,$04,$00
+ .byte $00,$A0,$AA,$AE,$0A,$0E,$0A,$00
+ .byte $00,$40,$68,$82,$44,$28,$C2,$40
+ .byte $00,$C4,$64,$E4,$60,$C0,$40,$00
+ .byte $00,$44,$82,$82,$82,$82,$82,$44
+ .byte $00,$04,$A4,$4E,$E4,$44,$A0,$00
+ .byte $00,$00,$00,$0E,$00,$40,$40,$80
+ .byte $00,$02,$02,$04,$04,$08,$48,$00
+ .byte $00,$E4,$AC,$A4,$A4,$A4,$EE,$00
+ .byte $00,$EE,$22,$22,$EE,$82,$EE,$00
+ .byte $00,$AE,$A8,$AE,$E2,$22,$2E,$00
+ .byte $00,$EE,$82,$E2,$A4,$A4,$E4,$00
+ .byte $00,$EE,$AA,$EA,$AE,$A2,$EE,$00
+ .byte $00,$00,$00,$44,$00,$44,$04,$08
+ .byte $00,$20,$4E,$80,$4E,$20,$00,$00
+ .byte $00,$8C,$42,$22,$44,$80,$04,$00
+
+ ; @ A B C etc (codes 64-95)
+ .byte $00,$6E,$9A,$BA,$BE,$8A,$6A,$00
+ .byte $00,$C6,$A8,$C8,$A8,$A8,$C6,$00
+ .byte $00,$CE,$A8,$AC,$A8,$A8,$CE,$00
+ .byte $00,$E6,$88,$C8,$8A,$8A,$86,$00
+ .byte $00,$AE,$A4,$E4,$A4,$A4,$AE,$00
+ .byte $00,$2A,$2A,$2C,$2A,$2A,$CA,$00
+ .byte $00,$8A,$8E,$8E,$8A,$8A,$EA,$00
+ .byte $00,$C4,$AA,$AA,$AA,$AA,$A4,$00
+ .byte $00,$EE,$AA,$EA,$8A,$8A,$8E,$03
+ .byte $00,$C6,$A8,$AC,$C2,$A2,$AC,$00
+ .byte $00,$EA,$4A,$4A,$4A,$4A,$4E,$00
+ .byte $00,$AA,$AA,$AA,$AE,$AE,$4A,$00
+ .byte $00,$AA,$4A,$4E,$44,$44,$A4,$00
+ .byte $00,$EE,$28,$48,$88,$88,$E8,$0E
+ .byte $00,$8E,$82,$42,$42,$22,$22,$0E
+ .byte $00,$00,$40,$A0,$00,$00,$00,$0F
+
+ ; diamond, lowercase letters, control codes (codes 96-127)
+ .byte $00,$00,$00,$46,$E2,$4E,$0E,$00
+ .byte $00,$80,$80,$C6,$A8,$A8,$C6,$00
+ .byte $00,$20,$20,$6E,$AE,$A8,$6E,$00
+ .byte $00,$00,$C0,$86,$CA,$8E,$82,$0C
+ .byte $00,$80,$84,$80,$C4,$A4,$A4,$00
+ .byte $00,$08,$28,$0A,$2C,$2A,$2A,$C0
+ .byte $00,$40,$40,$4A,$4E,$4A,$4A,$00
+ .byte $00,$00,$00,$CE,$AA,$AA,$AE,$00
+ .byte $00,$00,$00,$C6,$AA,$C6,$82,$82
+ .byte $00,$00,$00,$6E,$88,$86,$8E,$00
+ .byte $00,$00,$40,$EA,$4A,$4A,$6E,$00
+ .byte $00,$00,$00,$AA,$AA,$AE,$4A,$00
+ .byte $00,$00,$00,$AA,$4A,$A6,$A2,$0C
+ .byte $00,$00,$04,$EE,$4E,$84,$EE,$00
+ .byte $40,$4E,$4C,$4E,$4A,$42,$42,$40
+ .byte $00,$28,$6C,$EE,$6C,$28,$00,$00
+ .endif
+
+right_margin:
+ ; Default value is 79 decimal. Unsure why the author didn't use RMARGN at $53
+ .byte $4F
+
+; ----------------------------------------------------------------------------
+; Start of COL80 code.
+
+; Callback for CIO OPEN command.
+
+col80_open:
+ jsr init_graphics_8
+ lda #$00
+ sta ROWCRS
+ sta COLCRS
+ .ifndef FUJICHAT
+ nop
+ nop
+ .endif
+ sta BUFCNT
+ lda #$4F
+ sta right_margin
+ rts
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08
+ sta ICAX2Z
+ lda #$0C
+ sta ICAX1Z
+ jsr open_s_dev
+
+ ; Set COL80's default colors
+ lda #$08
+ sta COLOR2
+ .ifndef FUJICHAT
+ nop
+ nop
+ nop
+ .endif
+ lda #$00
+ sta COLOR1
+
+ ; Protect ourselves from BASIC and the OS
+ lda #<START_ADDRESS
+ sta MEMTOP
+ lda #>START_ADDRESS
+ sta MEMTOP+1
+ rts
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi
+ pha
+ lda s_dev_open_lo
+ pha
+ rts
+
+; ----------------------------------------------------------------------------
+; Callback for CIO CLOSE command. Note that the routine does nothing, really
+; (the OS will mark the E: device as being closed, but COL80 doesn't do any
+; cleanup).
+; The SPECIAL and GET STATUS callbacks in col80_vector_tab also point here.
+
+col80_close:
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Callback for the internal put-one-byte, used by the OS to implement the
+; CIO PUT RECORD and PUT BYTES commands. This routine's one argument is
+; the byte in the accumulator (the character to print).
+
+; First, the routine checks for the cursor control characters it supports.
+; COL80 only handles the EOL and clear-screen codes; trying to print
+; backspaces, arrows, deletes, inserts, etc just causes their ATASCII
+; graphics character to print instead.
+
+col80_putbyte:
+ ; EOL (decimal 155)?
+ cmp #$9B
+ bne check_clear
+ lda right_margin
+ sta COLCRS
+ jmp skip_write
+
+check_clear:
+ .ifndef FUJICHAT ; save memory by not including clear_screen
+ ; (also, this lets us print the } character)
+ ; Clear (decimal 125)?
+ cmp #$7D
+ bne regular_char
+ jmp clear_screen
+ .endif
+
+ ; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax
+ bpl not_inverse
+ lda #$FF
+ sta inverse_mask
+ bne skip_ninv
+
+not_inverse:
+ lda #$00
+ sta inverse_mask
+
+skip_ninv:
+ txa
+ and #$7F
+ .ifdef FUJICHAT ; mask out low ASCII
+ sec
+ sbc #$20
+ bcs not_low_ascii
+ jmp return_success
+not_low_ascii:
+ .endif
+ sta TMPCHR
+ lda DINDEX
+ cmp #$08
+ beq graphics_ok
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col80_open
+
+graphics_ok:
+ ; Call the routines that actually print the character
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor
+
+check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ lda SSFLAG
+ bne check_ssflag
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Scroll the screen up one line (8 scanlines). This has to move almost 8K of
+; data, so it's noticeably slower than scrolling the GR.0 text screen.
+
+scroll_screen:
+ lda SAVMSC
+ sta screen_ptr_lo
+ clc
+ adc #$40
+ ; font_ptr_lo is actually being used here as a second pointer into
+ ; screen RAM, instead of its usual use as a pointer into the
+ ; font_data table
+ sta font_ptr_lo
+ lda SAVMSC+1
+ sta screen_ptr_hi
+ adc #$01
+ sta font_ptr_hi
+ ldx #$1D
+ ldy #$00
+
+scroll_line_loop:
+ lda (font_ptr_lo),y
+ sta (screen_ptr_lo),y
+ dey
+ bne scroll_line_loop
+ inc font_ptr_hi
+ inc screen_ptr_hi
+ dex
+ bne scroll_line_loop
+
+blank_bottom_row:
+ lda SAVMSC
+ clc
+ adc #$C0
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ adc #$1C
+ sta screen_ptr_hi
+ lda #$00
+ tay
+
+blank_loop:
+ sta (screen_ptr_lo),y
+ dey
+ bne blank_loop
+ inc screen_ptr_hi
+ ldy #$40
+
+blank_tail:
+ sta (screen_ptr_lo),y
+ dey
+ bpl blank_tail
+ rts
+
+; ----------------------------------------------------------------------------
+; Set up font_ptr_lo/hi to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+setup_font_ptr:
+ lda #$00
+ sta font_ptr_hi
+ sta lo_nybble_flag
+ lda TMPCHR
+ clc
+ ror
+ bcc font_hi_nybble
+ ldx #$FF
+ stx lo_nybble_flag
+
+font_hi_nybble:
+ clc
+ rol
+ rol
+ rol font_ptr_hi
+ rol
+ rol font_ptr_hi
+ adc #<font_data
+ sta font_ptr_lo
+ lda #>font_data
+ adc font_ptr_hi
+ sta font_ptr_hi
+ rts
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS
+ lda right_margin
+ cmp COLCRS
+ bcs same_line
+ lda LMARGN
+ sta COLCRS
+ lda ROWCRS
+ ; $17 is 25 decimal, one row below the lowest on the screen
+ cmp #$17
+ bcc no_scroll
+ jsr scroll_screen
+ ; Move to row 24 after scrolling
+ lda #$16
+ sta ROWCRS
+
+no_scroll:
+ inc ROWCRS
+
+same_line:
+ rts
+
+; ----------------------------------------------------------------------------
+; Clear the screen by setting all screen RAM bytes to zero. Slow, but not
+; as slow as scrolling.
+
+ .ifndef FUJICHAT
+clear_screen:
+ lda SAVMSC
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ sta screen_ptr_hi
+ ldy #$00
+ ldx #$1D
+ lda #$00
+
+cls_loop:
+ sta (screen_ptr_lo),y
+ dey
+ bne cls_loop
+ inc screen_ptr_hi
+ dex
+ bne cls_loop
+ jsr blank_bottom_row
+ lda LMARGN
+ sta COLCRS
+ lda #$00
+ sta ROWCRS
+ ; redundant JMP
+ jmp return_success
+ .endif
+
+; ----------------------------------------------------------------------------
+; CIO expects the Y register to contain a status code.
+; 1 means success (no error). Lots of COL80's routines
+; jump here.
+
+return_success:
+ ldy #$01
+ rts
+
+; ----------------------------------------------------------------------------
+; Set screen_ptr_lo/hi to point to the address of the first byte of graphics
+; data at the current cursor position.
+
+setup_screen_ptr:
+ ldy ROWCRS
+ lda SAVMSC
+ clc
+ adc row_low_offset_tab,y
+ sta screen_ptr_lo
+ lda SAVMSC+1
+ adc row_high_offset_tab,y
+ sta screen_ptr_hi
+ lda COLCRS
+ lsr
+ clc
+ adc screen_ptr_lo
+ bcc hi_byte_ok
+ inc screen_ptr_hi
+
+hi_byte_ok:
+ sta screen_ptr_lo
+ rts
+
+; ----------------------------------------------------------------------------
+; Tables of offsets for setup_screen_ptr, to avoid doing multiplication at
+; runtime (the 6502 lacks a MUL instruction, so it's slow...)
+
+row_low_offset_tab:
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0
+
+row_high_offset_tab:
+ .byte $00,$01,$02,$03,$05,$06,$07,$08
+ .byte $0A,$0B,$0C,$0D,$0F,$10,$11,$12
+ .byte $14,$15,$16,$17,$19,$1A,$1B,$1C
+
+; ----------------------------------------------------------------------------
+; Copy pixel data from the font table to screen RAM.
+; font_ptr_lo/hi must point to the correct character, and screen_ptr_lo/hi
+; must point to the correct screen address for the current cursor position.
+; This routine has separate execution paths for even- and odd-numbered
+; cursor positions, since each byte of screen RAM holds data for two
+; adjacent characters (and when printing to one of them, the other needs
+; to be left undisturbed!)
+
+write_font_data:
+ lda COLCRS
+ clc
+ ror
+ bcc write_font_data_even
+ ldx #$00
+ ldy #$00
+
+get_font_nybble_odd:
+ lda (font_ptr_lo),y
+ bit lo_nybble_flag
+ bne lo_nybble_odd
+ ; glyph we want is stored in top 4 bits of font byte,
+ ; shift it down to the bottom 4 bits
+ lsr
+ lsr
+ lsr
+ lsr
+
+lo_nybble_odd:
+ eor inverse_mask
+ and #$0F
+ sta TMPCHR
+ ldy scanline_offset_tab,x
+ lda (screen_ptr_lo),y
+ and #$F0
+ ora TMPCHR
+ sta (screen_ptr_lo),y
+ inx
+ cpx #$07
+ bne screen_ptr_ok_odd
+ inc screen_ptr_hi
+
+screen_ptr_ok_odd:
+ cpx #$08
+ beq write_font_done_odd
+ txa
+ tay
+ bne get_font_nybble_odd
+
+write_font_done_odd:
+ rts
+
+; ----------------------------------------------------------------------------
+; Write data to even-numbered columns, very similar to the above
+
+write_font_data_even:
+ ldx #$00
+ ldy #$00
+
+get_font_nybble_even:
+ lda (font_ptr_lo),y
+ bit lo_nybble_flag
+ beq hi_nybble_even
+ asl
+ asl
+ asl
+ asl
+
+hi_nybble_even:
+ eor inverse_mask
+ and #$F0
+ sta TMPCHR
+ ldy scanline_offset_tab,x
+ lda (screen_ptr_lo),y
+ and #$0F
+ ora TMPCHR
+ sta (screen_ptr_lo),y
+ inx
+ cpx #$07
+ bne screen_ptr_ok_even
+ inc screen_ptr_hi
+
+screen_ptr_ok_even:
+ cpx #$08
+ beq write_font_done_even
+ txa
+ tay
+ bne get_font_nybble_even
+
+write_font_done_even:
+ rts
+
+; ----------------------------------------------------------------------------
+
+scanline_offset_tab:
+ .byte $00,$28,$50,$78,$A0,$C8,$F0,$18
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL80 maintains a line buffer. Each time col80_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is exactly how the OS E: device works.
+
+col80_getbyte:
+ lda BUFCNT
+ beq get_line
+
+get_next_byte:
+ ldx line_buffer_index
+ lda line_buffer,x
+ dec BUFCNT
+ inc line_buffer_index
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Get a line of input from the user, terminated by the Return key.
+
+get_line:
+ lda #$00
+ sta BUFCNT
+ sta line_buffer_index
+
+show_cursor:
+ .ifdef FUJICHAT
+ lda #$00
+ .else
+ lda #$20
+ .endif
+ sta TMPCHR
+ lda #$FF
+ sta inverse_mask
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+ jsr get_keystroke
+ cpy #$01
+ beq keystroke_ok
+ .ifdef FUJICHAT
+ dey ; yes, we really care about 1-byte optimizations
+ .else
+ ldy #$00
+ .endif
+ sty line_buffer_index
+ sty BUFCNT
+
+keystroke_ok:
+ .ifdef FUJICHAT
+ cmp #$20
+ bcc show_cursor ; ignore low ASCII
+ .endif
+ cmp #$9B
+ bne check_backs_key
+ jmp return_key_hit
+
+check_backs_key:
+ cmp #$7E
+ bne check_clear_key
+ jmp backs_key_hit
+
+check_clear_key:
+ cmp #$7D
+ bne normal_key_hit
+ jmp clear_key_hit
+
+normal_key_hit:
+ ldx BUFCNT
+ bpl buffer_character
+ .ifdef FUJICHAT
+ jmp show_cursor
+ .else
+ jmp beep
+ .endif
+
+buffer_character:
+ sta line_buffer,x
+ jsr col80_putbyte
+ inc BUFCNT
+ jmp show_cursor
+
+return_key_hit:
+ jsr print_space
+ lda #$9B
+ ldx BUFCNT
+ sta line_buffer,x
+ inc BUFCNT
+ jsr col80_putbyte
+ jmp get_next_byte
+
+clear_key_hit:
+ .ifndef FUJICHAT
+ jsr clear_screen
+ .endif
+ lda #$00
+ sta line_buffer_index
+ sta BUFCNT
+ jmp get_line
+
+backs_key_hit:
+ jsr print_space
+ lda BUFCNT
+ beq backs_key_done
+ dec COLCRS
+ lda COLCRS
+ clc
+ adc #$01
+ cmp LMARGN
+ bne backs_same_line
+ lda right_margin
+ sta COLCRS
+ dec ROWCRS
+
+backs_same_line:
+ dec BUFCNT
+
+backs_key_done:
+ jmp show_cursor
+
+; ----------------------------------------------------------------------------
+; Ring the margin bell. COL80 doesn't implement the ctrl-2 bell (character
+; 253), and instead of using the GTIA keyclick speaker, it uses POKEY to
+; make a beep
+
+ .ifndef FUJICHAT
+beep: ldy #$00
+ ldx #$AF
+
+beep_delay_x:
+ stx AUDF1
+ stx AUDC1
+
+beep_delay_y:
+ dey
+ bne beep_delay_y
+ dex
+ cpx #$9F
+ bne beep_delay_x
+ jmp show_cursor
+ .endif
+
+; ----------------------------------------------------------------------------
+; Print a space character at the current cursor position. Does not
+; update the cursor position.
+print_space:
+ lda #$00
+ sta inverse_mask
+ .ifndef FUJICHAT
+ lda #$20
+ .endif
+ sta TMPCHR
+ jsr setup_font_ptr
+ jsr setup_screen_ptr
+ jsr write_font_data
+ rts
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+get_keystroke:
+ lda k_dev_get_hi
+ pha
+ lda k_dev_get_lo
+ pha
+ rts
+
+ .ifndef FUJICHAT
+ .include "col80_init.s"
+ .endif
+
+; ----------------------------------------------------------------------------
+; COL80 vector table, in the format required by the OS. Our HATABS entry
+; will point to this table, and the OS will call the routines listed here
+; via the "call by RTS" method (which is why they're address-minus-one).
+
+; See the entry on HATABS in "Mapping the Atari" or the OS manual.
+
+col80_vector_tab:
+ .word col80_open-1
+ .word col80_close-1
+ .word col80_getbyte-1
+ .word col80_putbyte-1
+ .word col80_close-1
+ .word col80_close-1
+ .ifdef FUJICHAT
+ .byte 0, 0, 0 ; heh.
+ .else
+ jmp col80_init
+ .endif
+
+ .ifndef FUJICHAT
+ .include "col80_entry.s"
+ .endif
+
+; ----------------------------------------------------------------------------
+; Various bits of runtime state here. It's unclear to me why the standard
+; OS buffer location couldn't have been used instead (normally the top
+; half of page 5), or why the other stuff couldn't have been stored in
+; zero page, in locations used by the ROM E: handler (thus unused when
+; it's replaced with COL80). line_buffer_index needs to be preserved
+; across calls to col80_getbyte, but lo_nybble_flag and inverse_mask are
+; freshly calculated every time they're used, so they could be almost
+; anywhere.
+
+ .ifdef FUJICHAT
+ .segment "CODE"
+ .endif
+
+lo_nybble_flag:
+ .byte $00
+
+inverse_mask:
+ .byte $00
+
+line_buffer_index:
+ .byte $12
+
+; ----------------------------------------------------------------------------
+; There's absolutely no reason why this data needs to be included in the
+; binary load file: the line buffer's initial contents are meaningless, they
+; will be blown away the first time anything reads from the E: device.
+
+; Notice the author was running his debugger in COL80 when he built the
+; binary (ASCII "S COL80 7A00 7F80" command still in the buffer).
+
+ .ifdef FUJICHAT
+line_buffer = $03FD ; cassette buffer
+ .else
+line_buffer:
+ .byte $53,$20,$43,$4F,$4C,$38,$30,$20
+ .byte $37,$41,$30,$30,$20,$37,$46,$38
+ .byte $30,$9B,$20,$20,$20,$20,$9B,$27
+ .byte $40,$40,$40,$40,$28,$28,$28,$28
+ .byte $40,$40,$40,$40,$40,$40,$40,$40
+ .byte $40,$40,$40,$40,$40,$40,$40,$40
+ .byte $9B,$FD,$FD,$FD,$FD,$9B
+ .endif
+
+END_ADDRESS = *-1
+
+; I've found a variant (modified version?) of this code, that doesn't
+; include the line_buffer in the file (no reason for it to be there),
+; or the $0C segment, and that has another segment, loaded at $6000,
+; with the run address changed to $6000. The code looks like:
+
+; .org $6000
+; jsr dosini_entry_point
+; lda #$50
+; sta RMARGN
+; lda #$00
+; sta COLOR2
+
+; also, the default colors have been changed in init_graphics_8.
+
+; There are at least two binaries floating around that contain
+; extra (garbage) bytes at the end, presumably from being transferred
+; over XMODEM or similar. They are otherwise identical.
+
diff --git a/src/col80_modified/cruft/col80_main.s.orig b/src/col80_modified/cruft/col80_main.s.orig
new file mode 100644
index 0000000..0b56ee3
--- /dev/null
+++ b/src/col80_modified/cruft/col80_main.s.orig
@@ -0,0 +1,895 @@
+; COL80.COM, aka COL80E.COM, aka COL80HND.COM
+; (and probably several other names)
+
+; Original author unknown
+; License unknown
+; Disassembly and comments by Urchlay
+
+; This is a widely-distributed software 80-column driver for the Atari
+; 8-bit computers. It replaces the OS's E: driver, and uses GRAPHICS 8
+; for display, with 4x8 pixel character cells.
+
+; Disassembly was done with da65, with many iterations of "edit the
+; .info file, disassemble again", and the results were tweaked by hand
+; into something assemblable by dasm (and fairly compatible with other
+; assemblers).
+
+
+; START_ADDRESS is defined in col80_startaddr.s
+ .org START_ADDRESS
+
+; ----------------------------------------------------------------------------
+; Zero page labels (OS equates)
+
+DOSINI = $000C
+ICAX1Z = $002A
+ICAX2Z = $002B
+TMPCHR = $0050
+LMARGN = $0052
+ROWCRS = $0054
+COLCRS = $0055
+DINDEX = $0057
+SAVMSC = $0058
+BUFCNT = $006B
+
+; ----------------------------------------------------------------------------
+; Zero page labels (COL80 equates)
+
+screen_ptr_lo = $00CB
+screen_ptr_hi = $00CC
+font_ptr_lo = $00CD
+font_ptr_hi = $00CE
+
+; ----------------------------------------------------------------------------
+; Non-zeropage RAM labels (OS equates)
+
+COLOR1 = $02C5
+COLOR2 = $02C6
+RUNAD = $02E0
+MEMTOP = $02E5
+SSFLAG = $02FF
+HATABS = $031A
+ICCOM = $0342
+ICBAL = $0344
+ICBAH = $0345
+
+; ----------------------------------------------------------------------------
+; Hardware (memory-mapped I/O, OS equates)
+
+CONSOL = $D01F
+AUDF1 = $D200
+AUDC1 = $D201
+
+; ----------------------------------------------------------------------------
+; OS ROM labels
+
+s_dev_open_lo = $E410 ; (not named in OS sources)
+s_dev_open_hi = $E411 ; ""
+k_dev_get_lo = $E424 ; ""
+k_dev_get_hi = $E425 ; ""
+CIOV = $E456 ; Central Input/Output entry point
+
+; ----------------------------------------------------------------------------
+; Start of COL80. The font is stored in packed form. Each group of 8 bytes
+; defines two glyphs: the upper 4 bits of the 8 bytes, taken together,
+; define the bitmap for the first glyph, and the lower 4 bits are the second.
+; Note that the bits that make up a single character are spread across 8
+; bytes, so it's hard to visualize these even if you're used to reading hex
+; dumps.
+
+; The first 2 characters look like:
+
+; .... .O.. ; $04
+; .... .O.. ; $04
+; O.O. .O.. ; $A4
+; OOO. .O.. ; $E4
+; OOO. .OOO ; $E7
+; .O.. .O.. ; $44
+; .... .O.. ; $04
+; .... .O.. ; $04
+
+; These are the ATASCII heart symbol (character code 0) and the ATASCII
+; control-A line-drawing symbol (code 1).
+
+; Note: unlike the ROM font, this font is stored in ATASCII order instead
+; of the standard Atari character order imposed by the hardware. Like
+; the ROM font, inverse characters are not stored here (the bitmaps get
+; inverted by the driver)
+
+font_data:
+ ; Low ATASCII graphics symbols (code 0-31)
+ .byte $04,$04,$A4,$E4,$E7,$44,$04,$04 ; 7A00
+ .byte $14,$14,$14,$14,$1C,$10,$10,$10 ; 7A08
+ .byte $40,$40,$40,$40,$CC,$44,$44,$44 ; 7A10
+ .byte $18,$18,$24,$24,$42,$42,$81,$81 ; 7A18
+ .byte $10,$10,$30,$30,$73,$73,$F3,$F3 ; 7A20
+ .byte $83,$83,$C3,$C3,$E0,$E0,$F0,$F0 ; 7A28
+ .byte $CF,$CF,$C0,$C0,$00,$00,$00,$00 ; 7A30
+ .byte $00,$00,$00,$00,$0C,$0C,$FC,$FC ; 7A38
+ .byte $00,$00,$00,$40,$A7,$44,$E4,$04 ; 7A40
+ .byte $04,$04,$04,$04,$FF,$04,$04,$04 ; 7A48
+ .byte $00,$00,$60,$F0,$FF,$6F,$0F,$0F ; 7A50
+ .byte $80,$80,$80,$80,$8F,$84,$84,$84 ; 7A58
+ .byte $4C,$4C,$4C,$4C,$FC,$0C,$0C,$0C ; 7A60
+ .byte $40,$4C,$48,$4C,$78,$0C,$06,$00 ; 7A68
+ .byte $00,$44,$E4,$44,$4E,$44,$00,$00 ; 7A70
+ .byte $00,$24,$42,$FF,$42,$24,$00,$00 ; 7A78
+
+ ; Space ! " # etc (codes 32-63)
+ .byte $00,$04,$04,$04,$04,$00,$04,$00 ; 7A80
+ .byte $00,$A0,$AA,$AE,$0A,$0E,$0A,$00 ; 7A88
+ .byte $00,$40,$68,$82,$44,$28,$C2,$40 ; 7A90
+ .byte $00,$C4,$64,$E4,$60,$C0,$40,$00 ; 7A98
+ .byte $00,$44,$82,$82,$82,$82,$82,$44 ; 7AA0
+ .byte $00,$04,$A4,$4E,$E4,$44,$A0,$00 ; 7AA8
+ .byte $00,$00,$00,$0E,$00,$40,$40,$80 ; 7AB0
+ .byte $00,$02,$02,$04,$04,$08,$48,$00 ; 7AB8
+ .byte $00,$E4,$AC,$A4,$A4,$A4,$EE,$00 ; 7AC0
+ .byte $00,$EE,$22,$22,$EE,$82,$EE,$00 ; 7AC8
+ .byte $00,$AE,$A8,$AE,$E2,$22,$2E,$00 ; 7AD0
+ .byte $00,$EE,$82,$E2,$A4,$A4,$E4,$00 ; 7AD8
+ .byte $00,$EE,$AA,$EA,$AE,$A2,$EE,$00 ; 7AE0
+ .byte $00,$00,$00,$44,$00,$44,$04,$08 ; 7AE8
+ .byte $00,$20,$4E,$80,$4E,$20,$00,$00 ; 7AF0
+ .byte $00,$8C,$42,$22,$44,$80,$04,$00 ; 7AF8
+
+ ; @ A B C etc (codes 64-95)
+ .byte $00,$6E,$9A,$BA,$BE,$8A,$6A,$00 ; 7B00
+ .byte $00,$C6,$A8,$C8,$A8,$A8,$C6,$00 ; 7B08
+ .byte $00,$CE,$A8,$AC,$A8,$A8,$CE,$00 ; 7B10
+ .byte $00,$E6,$88,$C8,$8A,$8A,$86,$00 ; 7B18
+ .byte $00,$AE,$A4,$E4,$A4,$A4,$AE,$00 ; 7B20
+ .byte $00,$2A,$2A,$2C,$2A,$2A,$CA,$00 ; 7B28
+ .byte $00,$8A,$8E,$8E,$8A,$8A,$EA,$00 ; 7B30
+ .byte $00,$C4,$AA,$AA,$AA,$AA,$A4,$00 ; 7B38
+ .byte $00,$EE,$AA,$EA,$8A,$8A,$8E,$03 ; 7B40
+ .byte $00,$C6,$A8,$AC,$C2,$A2,$AC,$00 ; 7B48
+ .byte $00,$EA,$4A,$4A,$4A,$4A,$4E,$00 ; 7B50
+ .byte $00,$AA,$AA,$AA,$AE,$AE,$4A,$00 ; 7B58
+ .byte $00,$AA,$4A,$4E,$44,$44,$A4,$00 ; 7B60
+ .byte $00,$EE,$28,$48,$88,$88,$E8,$0E ; 7B68
+ .byte $00,$8E,$82,$42,$42,$22,$22,$0E ; 7B70
+ .byte $00,$00,$40,$A0,$00,$00,$00,$0F ; 7B78
+
+ ; diamond, lowercase letters, control codes (codes 96-127)
+ .byte $00,$00,$00,$46,$E2,$4E,$0E,$00 ; 7B80
+ .byte $00,$80,$80,$C6,$A8,$A8,$C6,$00 ; 7B88
+ .byte $00,$20,$20,$6E,$AE,$A8,$6E,$00 ; 7B90
+ .byte $00,$00,$C0,$86,$CA,$8E,$82,$0C ; 7B98
+ .byte $00,$80,$84,$80,$C4,$A4,$A4,$00 ; 7BA0
+ .byte $00,$08,$28,$0A,$2C,$2A,$2A,$C0 ; 7BA8
+ .byte $00,$40,$40,$4A,$4E,$4A,$4A,$00 ; 7BB0
+ .byte $00,$00,$00,$CE,$AA,$AA,$AE,$00 ; 7BB8
+ .byte $00,$00,$00,$C6,$AA,$C6,$82,$82 ; 7BC0
+ .byte $00,$00,$00,$6E,$88,$86,$8E,$00 ; 7BC8
+ .byte $00,$00,$40,$EA,$4A,$4A,$6E,$00 ; 7BD0
+ .byte $00,$00,$00,$AA,$AA,$AE,$4A,$00 ; 7BD8
+ .byte $00,$00,$00,$AA,$4A,$A6,$A2,$0C ; 7BE0
+ .byte $00,$00,$04,$EE,$4E,$84,$EE,$00 ; 7BE8
+ .byte $40,$4E,$4C,$4E,$4A,$42,$42,$40 ; 7BF0
+ .byte $00,$28,$6C,$EE,$6C,$28,$00,$00 ; 7BF8
+
+right_margin:
+ ; Default value is 79 decimal. Unsure why the author didn't use RMARGN at $53
+ .byte $4F ; 7C00 4F
+
+; ----------------------------------------------------------------------------
+; Start of COL80 code.
+
+; Callback for CIO OPEN command.
+
+col80_open:
+ jsr init_graphics_8 ; 7C01 20 14 7C
+ lda #$00 ; 7C04 A9 00
+ sta ROWCRS ; 7C06 85 54
+ sta COLCRS ; 7C08 85 55
+ nop ; 7C0A EA
+ nop ; 7C0B EA
+ sta BUFCNT ; 7C0C 85 6B
+ lda #$4F ; 7C0E A9 4F
+ sta right_margin ; 7C10 8D 00 7C
+ rts ; 7C13 60
+
+; ----------------------------------------------------------------------------
+; Assembly version of GRAPHICS 8+16 command.
+
+init_graphics_8:
+ lda #$08 ; 7C14 A9 08
+ sta ICAX2Z ; 7C16 85 2B
+ lda #$0C ; 7C18 A9 0C
+ sta ICAX1Z ; 7C1A 85 2A
+ jsr open_s_dev ; 7C1C 20 37 7C
+
+ ; Set COL80's default colors
+ lda #$08 ; 7C1F A9 08
+ sta COLOR2 ; 7C21 8D C6 02
+ nop ; 7C24 EA
+ nop ; 7C25 EA
+ nop ; 7C26 EA
+ lda #$00 ; 7C27 A9 00
+ sta COLOR1 ; 7C29 8D C5 02
+
+ ; Protect ourselves from BASIC and the OS
+ lda #<START_ADDRESS ; 7C2C A9 00
+ sta MEMTOP ; 7C2E 8D E5 02
+ lda #>START_ADDRESS ; 7C31 A9 7A
+ sta MEMTOP+1 ; 7C33 8D E6 02
+ rts ; 7C36 60
+
+; ----------------------------------------------------------------------------
+; Call the OPEN vector for the S: device, using the ROM vector table
+; at $E410. The table stores address-minus-one of each routine, which is
+; meant to actually be called via the RTS instruction (standard 6502
+; technique, but confusing the first time you encounter it)
+
+open_s_dev:
+ lda s_dev_open_hi ; 7C37 AD 11 E4
+ pha ; 7C3A 48
+ lda s_dev_open_lo ; 7C3B AD 10 E4
+ pha ; 7C3E 48
+ rts ; 7C3F 60
+
+; ----------------------------------------------------------------------------
+; Callback for CIO CLOSE command. Note that the routine does nothing, really
+; (the OS will mark the E: device as being closed, but COL80 doesn't do any
+; cleanup).
+; The SPECIAL and GET STATUS callbacks in col80_vector_tab also point here.
+
+col80_close:
+ jmp return_success
+
+; ----------------------------------------------------------------------------
+; Callback for the internal put-one-byte, used by the OS to implement the
+; CIO PUT RECORD and PUT BYTES commands. This routine's one argument is
+; the byte in the accumulator (the character to print).
+
+; First, the routine checks for the cursor control characters it supports.
+; COL80 only handles the EOL and clear-screen codes; trying to print
+; backspaces, arrows, deletes, inserts, etc just causes their ATASCII
+; graphics character to print instead.
+
+col80_putbyte:
+ ; EOL (decimal 155)?
+ cmp #$9B ; 7C43 C9 9B
+ bne check_clear ; 7C45 D0 08
+ lda right_margin ; 7C47 AD 00 7C
+ sta COLCRS ; 7C4A 85 55
+ jmp skip_write ; 7C4C 4C 7C 7C
+
+check_clear:
+ ; Clear (decimal 125)?
+ cmp #$7D ; 7C4F C9 7D
+ bne regular_char ; 7C51 D0 03
+ jmp clear_screen ; 7C53 4C 0B 7D
+
+ ; See if this is an inverse video char (code >= 128)
+regular_char:
+ tax ; 7C56 AA
+ bpl not_inverse ; 7C57 10 07
+ lda #$FF ; 7C59 A9 FF
+ sta inverse_mask ; 7C5B 8D 49 7F
+ bne skip_ninv ; 7C5E D0 05
+
+not_inverse:
+ lda #$00 ; 7C60 A9 00
+ sta inverse_mask ; 7C62 8D 49 7F
+
+skip_ninv:
+ txa ; 7C65 8A
+ and #$7F ; 7C66 29 7F
+ sta TMPCHR ; 7C68 85 50
+ lda DINDEX ; 7C6A A5 57
+ cmp #$08 ; 7C6C C9 08
+ beq graphics_ok ; 7C6E F0 03
+ ; If we're not in GRAPHICS 8 mode, reinitialize ourselves
+ jsr col80_open ; 7C70 20 01 7C
+
+graphics_ok:
+ ; Call the routines that actually print the character
+ jsr setup_font_ptr ; 7C73 20 C9 7C
+ jsr setup_screen_ptr ; 7C76 20 34 7D
+ jsr write_font_data ; 7C79 20 82 7D
+
+skip_write:
+ ; Move the cursor 1 space to the right. This will
+ ; advance us to the next line if we're at the margin,
+ ; and scroll the screen if needed
+ jsr advance_cursor ; 7C7C 20 EE 7C
+
+check_ssflag:
+ ; The OS keyboard interrupt handler will toggle SSFLAG (start/stop fla
+ ; any time the user presses ctrl-1
+ lda SSFLAG ; 7C7F AD FF 02
+ bne check_ssflag ; 7C82 D0 FB
+ jmp return_success ; 7C84 4C 31 7D
+
+; ----------------------------------------------------------------------------
+; Scroll the screen up one line (8 scanlines). This has to move almost 8K of
+; data, so it's noticeably slower than scrolling the GR.0 text screen.
+
+scroll_screen:
+ lda SAVMSC ; 7C87 A5 58
+ sta screen_ptr_lo ; 7C89 85 CB
+ clc ; 7C8B 18
+ adc #$40 ; 7C8C 69 40
+ ; font_ptr_lo is actually being used here as a second pointer into
+ ; screen RAM, instead of its usual use as a pointer into the
+ ; font_data table
+ sta font_ptr_lo ; 7C8E 85 CD
+ lda SAVMSC+1 ; 7C90 A5 59
+ sta screen_ptr_hi ; 7C92 85 CC
+ adc #$01 ; 7C94 69 01
+ sta font_ptr_hi ; 7C96 85 CE
+ ldx #$1D ; 7C98 A2 1D
+ ldy #$00 ; 7C9A A0 00
+
+scroll_line_loop:
+ lda (font_ptr_lo),y ; 7C9C B1 CD
+ sta (screen_ptr_lo),y ; 7C9E 91 CB
+ dey ; 7CA0 88
+ bne scroll_line_loop ; 7CA1 D0 F9
+ inc font_ptr_hi ; 7CA3 E6 CE
+ inc screen_ptr_hi ; 7CA5 E6 CC
+ dex ; 7CA7 CA
+ bne scroll_line_loop ; 7CA8 D0 F2
+
+blank_bottom_row:
+ lda SAVMSC ; 7CAA A5 58
+ clc ; 7CAC 18
+ adc #$C0 ; 7CAD 69 C0
+ sta screen_ptr_lo ; 7CAF 85 CB
+ lda SAVMSC+1 ; 7CB1 A5 59
+ adc #$1C ; 7CB3 69 1C
+ sta screen_ptr_hi ; 7CB5 85 CC
+ lda #$00 ; 7CB7 A9 00
+ tay ; 7CB9 A8
+
+blank_loop:
+ sta (screen_ptr_lo),y ; 7CBA 91 CB
+ dey ; 7CBC 88
+ bne blank_loop ; 7CBD D0 FB
+ inc screen_ptr_hi ; 7CBF E6 CC
+ ldy #$40 ; 7CC1 A0 40
+
+blank_tail:
+ sta (screen_ptr_lo),y ; 7CC3 91 CB
+ dey ; 7CC5 88
+ bpl blank_tail ; 7CC6 10 FB
+ rts ; 7CC8 60
+
+; ----------------------------------------------------------------------------
+; Set up font_ptr_lo/hi to point to the font_data bitmap for the character in
+; TMPCHR. Also sets lo_nybble_flag to let the caller know whether the
+; bitmap is in the upper or lower 4 bits of the bytes pointed to.
+
+setup_font_ptr:
+ lda #$00 ; 7CC9 A9 00
+ sta font_ptr_hi ; 7CCB 85 CE
+ sta lo_nybble_flag ; 7CCD 8D 48 7F
+ lda TMPCHR ; 7CD0 A5 50
+ clc ; 7CD2 18
+ ror ; 7CD3 6A
+ bcc font_hi_nybble ; 7CD4 90 05
+ ldx #$FF ; 7CD6 A2 FF
+ stx lo_nybble_flag ; 7CD8 8E 48 7F
+
+font_hi_nybble:
+ clc ; 7CDB 18
+ rol ; 7CDC 2A
+ rol ; 7CDD 2A
+ rol font_ptr_hi ; 7CDE 26 CE
+ rol ; 7CE0 2A
+ rol font_ptr_hi ; 7CE1 26 CE
+ adc #<font_data ; 7CE3 69 00
+ sta font_ptr_lo ; 7CE5 85 CD
+ lda #>font_data ; 7CE7 A9 7A
+ adc font_ptr_hi ; 7CE9 65 CE
+ sta font_ptr_hi ; 7CEB 85 CE
+ rts ; 7CED 60
+
+; ----------------------------------------------------------------------------
+; Move the cursor one space to the right (to the next line if at the margin,
+; and scroll screen if on the last row)
+
+advance_cursor:
+ inc COLCRS ; 7CEE E6 55
+ lda right_margin ; 7CF0 AD 00 7C
+ cmp COLCRS ; 7CF3 C5 55
+ bcs same_line ; 7CF5 B0 13
+ lda LMARGN ; 7CF7 A5 52
+ sta COLCRS ; 7CF9 85 55
+ lda ROWCRS ; 7CFB A5 54
+ ; $17 is 25 decimal, one row below the lowest on the screen
+ cmp #$17 ; 7CFD C9 17
+ bcc no_scroll ; 7CFF 90 07
+ jsr scroll_screen ; 7D01 20 87 7C
+ ; Move to row 24 after scrolling
+ lda #$16 ; 7D04 A9 16
+ sta ROWCRS ; 7D06 85 54
+
+no_scroll:
+ inc ROWCRS ; 7D08 E6 54
+
+same_line:
+ rts ; 7D0A 60
+
+; ----------------------------------------------------------------------------
+; Clear the screen by setting all screen RAM bytes to zero. Slow, but not
+; as slow as scrolling.
+
+clear_screen:
+ lda SAVMSC ; 7D0B A5 58
+ sta screen_ptr_lo ; 7D0D 85 CB
+ lda SAVMSC+1 ; 7D0F A5 59
+ sta screen_ptr_hi ; 7D11 85 CC
+ ldy #$00 ; 7D13 A0 00
+ ldx #$1D ; 7D15 A2 1D
+ lda #$00 ; 7D17 A9 00
+
+cls_loop:
+ sta (screen_ptr_lo),y ; 7D19 91 CB
+ dey ; 7D1B 88
+ bne cls_loop ; 7D1C D0 FB
+ inc screen_ptr_hi ; 7D1E E6 CC
+ dex ; 7D20 CA
+ bne cls_loop ; 7D21 D0 F6
+ jsr blank_bottom_row ; 7D23 20 AA 7C
+ lda LMARGN ; 7D26 A5 52
+ sta COLCRS ; 7D28 85 55
+ lda #$00 ; 7D2A A9 00
+ sta ROWCRS ; 7D2C 85 54
+ ; redundant JMP
+ jmp return_success ; 7D2E 4C 31 7D
+
+; ----------------------------------------------------------------------------
+; CIO expects the Y register to contain a status code.
+; 1 means success (no error). Lots of COL80's routines
+; jump here.
+
+return_success:
+ ldy #$01 ; 7D31 A0 01
+ rts ; 7D33 60
+
+; ----------------------------------------------------------------------------
+; Set screen_ptr_lo/hi to point to the address of the first byte of graphics
+; data at the current cursor position.
+
+setup_screen_ptr:
+ ldy ROWCRS ; 7D34 A4 54
+ lda SAVMSC ; 7D36 A5 58
+ clc ; 7D38 18
+ adc row_low_offset_tab,y ; 7D39 79 52 7D
+ sta screen_ptr_lo ; 7D3C 85 CB
+ lda SAVMSC+1 ; 7D3E A5 59
+ adc row_high_offset_tab,y ; 7D40 79 6A 7D
+ sta screen_ptr_hi ; 7D43 85 CC
+ lda COLCRS ; 7D45 A5 55
+ lsr ; 7D47 4A
+ clc ; 7D48 18
+ adc screen_ptr_lo ; 7D49 65 CB
+ bcc hi_byte_ok ; 7D4B 90 02
+ inc screen_ptr_hi ; 7D4D E6 CC
+
+hi_byte_ok:
+ sta screen_ptr_lo ; 7D4F 85 CB
+ rts ; 7D51 60
+
+; ----------------------------------------------------------------------------
+; Tables of offsets for setup_screen_ptr, to avoid doing multiplication at
+; runtime (the 6502 lacks a MUL instruction, so it's slow...)
+
+row_low_offset_tab:
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0 ; 7D52
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0 ; 7D5A
+ .byte $00,$40,$80,$C0,$00,$40,$80,$C0 ; 7D62
+
+row_high_offset_tab:
+ .byte $00,$01,$02,$03,$05,$06,$07,$08 ; 7D6A
+ .byte $0A,$0B,$0C,$0D,$0F,$10,$11,$12 ; 7D72
+ .byte $14,$15,$16,$17,$19,$1A,$1B,$1C ; 7D7A
+
+; ----------------------------------------------------------------------------
+; Copy pixel data from the font table to screen RAM.
+; font_ptr_lo/hi must point to the correct character, and screen_ptr_lo/hi
+; must point to the correct screen address for the current cursor position.
+; This routine has separate execution paths for even- and odd-numbered
+; cursor positions, since each byte of screen RAM holds data for two
+; adjacent characters (and when printing to one of them, the other needs
+; to be left undisturbed!)
+
+write_font_data:
+ lda COLCRS ; 7D82 A5 55
+ clc ; 7D84 18
+ ror ; 7D85 6A
+ bcc write_font_data_even ; 7D86 90 31
+ ldx #$00 ; 7D88 A2 00
+ ldy #$00 ; 7D8A A0 00
+
+get_font_nybble_odd:
+ lda (font_ptr_lo),y ; 7D8C B1 CD
+ bit lo_nybble_flag ; 7D8E 2C 48 7F
+ bne lo_nybble_odd ; 7D91 D0 04
+ ; glyph we want is stored in top 4 bits of font byte,
+ ; shift it down to the bottom 4 bits
+ lsr ; 7D93 4A
+ lsr ; 7D94 4A
+ lsr ; 7D95 4A
+ lsr ; 7D96 4A
+
+lo_nybble_odd:
+ eor inverse_mask ; 7D97 4D 49 7F
+ and #$0F ; 7D9A 29 0F
+ sta TMPCHR ; 7D9C 85 50
+ ldy scanline_offset_tab,x ; 7D9E BC EA 7D
+ lda (screen_ptr_lo),y ; 7DA1 B1 CB
+ and #$F0 ; 7DA3 29 F0
+ ora TMPCHR ; 7DA5 05 50
+ sta (screen_ptr_lo),y ; 7DA7 91 CB
+ inx ; 7DA9 E8
+ cpx #$07 ; 7DAA E0 07
+ bne screen_ptr_ok_odd ; 7DAC D0 02
+ inc screen_ptr_hi ; 7DAE E6 CC
+
+screen_ptr_ok_odd:
+ cpx #$08 ; 7DB0 E0 08
+ beq write_font_done_odd ; 7DB2 F0 04
+ txa ; 7DB4 8A
+ tay ; 7DB5 A8
+ bne get_font_nybble_odd ; 7DB6 D0 D4
+
+write_font_done_odd:
+ rts ; 7DB8 60
+
+; ----------------------------------------------------------------------------
+; Write data to even-numbered columns, very similar to the above
+
+write_font_data_even:
+ ldx #$00 ; 7DB9 A2 00
+ ldy #$00 ; 7DBB A0 00
+
+get_font_nybble_even:
+ lda (font_ptr_lo),y ; 7DBD B1 CD
+ bit lo_nybble_flag ; 7DBF 2C 48 7F
+ beq hi_nybble_even ; 7DC2 F0 04
+ asl ; 7DC4 0A
+ asl ; 7DC5 0A
+ asl ; 7DC6 0A
+ asl ; 7DC7 0A
+
+hi_nybble_even:
+ eor inverse_mask ; 7DC8 4D 49 7F
+ and #$F0 ; 7DCB 29 F0
+ sta TMPCHR ; 7DCD 85 50
+ ldy scanline_offset_tab,x ; 7DCF BC EA 7D
+ lda (screen_ptr_lo),y ; 7DD2 B1 CB
+ and #$0F ; 7DD4 29 0F
+ ora TMPCHR ; 7DD6 05 50
+ sta (screen_ptr_lo),y ; 7DD8 91 CB
+ inx ; 7DDA E8
+ cpx #$07 ; 7DDB E0 07
+ bne screen_ptr_ok_even ; 7DDD D0 02
+ inc screen_ptr_hi ; 7DDF E6 CC
+
+screen_ptr_ok_even:
+ cpx #$08 ; 7DE1 E0 08
+ beq write_font_done_even ; 7DE3 F0 04
+ txa ; 7DE5 8A
+ tay ; 7DE6 A8
+ bne get_font_nybble_even ; 7DE7 D0 D4
+
+write_font_done_even:
+ rts ; 7DE9 60
+
+; ----------------------------------------------------------------------------
+
+scanline_offset_tab:
+ .byte $00,$28,$50,$78,$A0,$C8,$F0,$18 ; 7DEA
+
+; ----------------------------------------------------------------------------
+; Callback for the internal get-one-byte, used by the OS to implement the
+; CIO GET RECORD and GET BYTES commands. This routine takes no arguments,
+; and returns the read byte in the accumulator.
+
+; Internally, COL80 maintains a line buffer. Each time col80_getbyte is
+; called, it returns the next character in the buffer. If the buffer's
+; empty (or if the last call returned the last character), a new line
+; of input is read from the user (and the first character is returned).
+; This is exactly how the OS E: device works.
+
+col80_getbyte:
+ lda BUFCNT ; 7DF2 A5 6B
+ beq get_line ; 7DF4 F0 0E
+
+get_next_byte:
+ ldx line_buffer_index ; 7DF6 AE 4A 7F
+ lda line_buffer,x ; 7DF9 BD 4B 7F
+ dec BUFCNT ; 7DFC C6 6B
+ inc line_buffer_index ; 7DFE EE 4A 7F
+ jmp return_success ; 7E01 4C 31 7D
+
+; ----------------------------------------------------------------------------
+; Get a line of input from the user, terminated by the Return key.
+
+get_line:
+ lda #$00 ; 7E04 A9 00
+ sta BUFCNT ; 7E06 85 6B
+ sta line_buffer_index ; 7E08 8D 4A 7F
+
+show_cursor:
+ lda #$20 ; 7E0B A9 20
+ sta TMPCHR ; 7E0D 85 50
+ lda #$FF ; 7E0F A9 FF
+ sta inverse_mask ; 7E11 8D 49 7F
+ jsr setup_font_ptr ; 7E14 20 C9 7C
+ jsr setup_screen_ptr ; 7E17 20 34 7D
+ jsr write_font_data ; 7E1A 20 82 7D
+ jsr get_keystroke ; 7E1D 20 B7 7E
+ cpy #$01 ; 7E20 C0 01
+ beq keystroke_ok ; 7E22 F0 07
+ ldy #$00 ; 7E24 A0 00
+ sty line_buffer_index ; 7E26 8C 4A 7F
+ sty BUFCNT ; 7E29 84 6B
+
+keystroke_ok:
+ cmp #$9B ; 7E2B C9 9B
+ bne check_backs_key ; 7E2D D0 03
+ jmp return_key_hit ; 7E2F 4C 52 7E
+
+check_backs_key:
+ cmp #$7E ; 7E32 C9 7E
+ bne check_clear_key ; 7E34 D0 03
+ jmp backs_key_hit ; 7E36 4C 71 7E
+
+check_clear_key:
+ cmp #$7D ; 7E39 C9 7D
+ bne normal_key_hit ; 7E3B D0 03
+ jmp clear_key_hit ; 7E3D 4C 64 7E
+
+normal_key_hit:
+ ldx BUFCNT ; 7E40 A6 6B
+ bpl buffer_character ; 7E42 10 03
+ jmp beep ; 7E44 4C 8F 7E
+
+buffer_character:
+ sta line_buffer,x ; 7E47 9D 4B 7F
+ jsr col80_putbyte ; 7E4A 20 43 7C
+ inc BUFCNT ; 7E4D E6 6B
+ jmp show_cursor ; 7E4F 4C 0B 7E
+
+return_key_hit:
+ jsr print_space ; 7E52 20 A4 7E
+ lda #$9B ; 7E55 A9 9B
+ ldx BUFCNT ; 7E57 A6 6B
+ sta line_buffer,x ; 7E59 9D 4B 7F
+ inc BUFCNT ; 7E5C E6 6B
+ jsr col80_putbyte ; 7E5E 20 43 7C
+ jmp get_next_byte ; 7E61 4C F6 7D
+
+clear_key_hit:
+ jsr clear_screen ; 7E64 20 0B 7D
+ lda #$00 ; 7E67 A9 00
+ sta line_buffer_index ; 7E69 8D 4A 7F
+ sta BUFCNT ; 7E6C 85 6B
+ jmp get_line ; 7E6E 4C 04 7E
+
+backs_key_hit:
+ jsr print_space ; 7E71 20 A4 7E
+ lda BUFCNT ; 7E74 A5 6B
+ beq backs_key_done ; 7E76 F0 14
+ dec COLCRS ; 7E78 C6 55
+ lda COLCRS ; 7E7A A5 55
+ clc ; 7E7C 18
+ adc #$01 ; 7E7D 69 01
+ cmp LMARGN ; 7E7F C5 52
+ bne backs_same_line ; 7E81 D0 07
+ lda right_margin ; 7E83 AD 00 7C
+ sta COLCRS ; 7E86 85 55
+ dec ROWCRS ; 7E88 C6 54
+
+backs_same_line:
+ dec BUFCNT ; 7E8A C6 6B
+
+backs_key_done:
+ jmp show_cursor ; 7E8C 4C 0B 7E
+
+; ----------------------------------------------------------------------------
+; Ring the margin bell. COL80 doesn't implement the ctrl-2 bell (character
+; 253), and instead of using the GTIA keyclick speaker, it uses POKEY to
+; make a beep
+
+beep: ldy #$00 ; 7E8F A0 00
+ ldx #$AF ; 7E91 A2 AF
+
+beep_delay_x:
+ stx AUDF1 ; 7E93 8E 00 D2
+ stx AUDC1 ; 7E96 8E 01 D2
+
+beep_delay_y:
+ dey ; 7E99 88
+ bne beep_delay_y ; 7E9A D0 FD
+ dex ; 7E9C CA
+ cpx #$9F ; 7E9D E0 9F
+ bne beep_delay_x ; 7E9F D0 F2
+ jmp show_cursor ; 7EA1 4C 0B 7E
+
+; ----------------------------------------------------------------------------
+; Print a space character at the current cursor position. Does not
+; update the cursor position.
+print_space:
+ lda #$00 ; 7EA4 A9 00
+ sta inverse_mask ; 7EA6 8D 49 7F
+ lda #$20 ; 7EA9 A9 20
+ sta TMPCHR ; 7EAB 85 50
+ jsr setup_font_ptr ; 7EAD 20 C9 7C
+ jsr setup_screen_ptr ; 7EB0 20 34 7D
+ jsr write_font_data ; 7EB3 20 82 7D
+ rts ; 7EB6 60
+
+; ----------------------------------------------------------------------------
+; Get a keystroke (blocking). Just calls the OS K: get-one-byte routine
+; (call by pushing address-minus-one then doing an RTS)
+get_keystroke:
+ lda k_dev_get_hi ; 7EB7 AD 25 E4
+ pha ; 7EBA 48
+ lda k_dev_get_lo ; 7EBB AD 24 E4
+ pha ; 7EBE 48
+ rts ; 7EBF 60
+
+; ----------------------------------------------------------------------------
+; Initialization callback. The OS will call this on coldstart (or would do,
+; if the driver were in ROM), and also on warmstart (because we stole the
+; DOSINI vector).
+; This routine is also the first thing that gets called by the mainline
+; init code. Its job is to install COL80 in the handler table at HATABS.
+; Actually the handler is first installed as X:, then the main init code
+; fixes this up to E: unless the user is holding down SELECT. This allows
+; the user to toggle between the 40-column ROM E: and COL80 without doing
+; a full reboot. No idea if this was a documented feature or something the
+; author used for development/debugging.
+
+col80_init:
+ ldy #$00 ; 7EC0 A0 00
+
+next_hatab_slot:
+ lda HATABS,y ; 7EC2 B9 1A 03
+ beq register_x_handler ; 7EC5 F0 0A
+ iny ; 7EC7 C8
+ iny ; 7EC8 C8
+ iny ; 7EC9 C8
+ cpy #$20 ; 7ECA C0 20
+ bcc next_hatab_slot ; 7ECC 90 F4
+ jmp return_success ; 7ECE 4C 31 7D
+
+register_x_handler:
+ lda #$58 ; 7ED1 A9 58
+ sta HATABS,y ; 7ED3 99 1A 03
+ lda #<col80_vector_tab ; 7ED6 A9 E5
+ iny ; 7ED8 C8
+ sta HATABS,y ; 7ED9 99 1A 03
+ lda #>col80_vector_tab ; 7EDC A9 7E
+ iny ; 7EDE C8
+ sta HATABS,y ; 7EDF 99 1A 03
+ jmp return_success ; 7EE2 4C 31 7D
+
+; ----------------------------------------------------------------------------
+; COL80 vector table, in the format required by the OS. Our HATABS entry
+; will point to this table, and the OS will call the routines listed here
+; via the "call by RTS" method (which is why they're address-minus-one).
+
+; See the entry on HATABS in "Mapping the Atari" or the OS manual.
+
+col80_vector_tab:
+ .word col80_open-1 ; 7EE5 00 7C
+ .word col80_close-1 ; 7EE7 3F 7C
+ .word col80_getbyte-1 ; 7EE9 F1 7D
+ .word col80_putbyte-1 ; 7EEB 42 7C
+ .word col80_close-1 ; 7EED 3F 7C
+ .word col80_close-1 ; 7EEF 3F 7C
+ jmp col80_init ; 7EF1 4C C0 7E
+
+; ----------------------------------------------------------------------------
+; The OS jumps here on warmstart (also, this is the run address in our
+; binary load file)
+
+dosini_entry_point:
+ nop ; 7EF4 EA
+ nop ; 7EF5 EA
+ nop ; 7EF6 EA
+
+main_entry_point:
+ jsr col80_init ; 7EF7 20 C0 7E
+ lda CONSOL ; 7EFA AD 1F D0
+ and #$04 ; 7EFD 29 04
+ beq no_e_handler ; 7EFF F0 2F
+ lda #$0C ; 7F01 A9 0C
+ sta ICCOM ; 7F03 8D 42 03
+ ldx #$00 ; 7F06 A2 00
+ jsr CIOV ; 7F08 20 56 E4
+ lda #$58 ; 7F0B A9 58
+ sta font_ptr_lo ; 7F0D 85 CD
+ lda #$03 ; 7F0F A9 03
+ sta ICCOM ; 7F11 8D 42 03
+ lda #$CD ; 7F14 A9 CD
+ sta ICBAL ; 7F16 8D 44 03
+ lda #$00 ; 7F19 A9 00
+ sta ICBAH ; 7F1B 8D 45 03
+ ldx #$00 ; 7F1E A2 00
+ jsr CIOV ; 7F20 20 56 E4
+ ldy #$07 ; 7F23 A0 07
+ lda #<col80_vector_tab ; 7F25 A9 E5
+ sta HATABS,y ; 7F27 99 1A 03
+ lda #>col80_vector_tab ; 7F2A A9 7E
+ iny ; 7F2C C8
+ sta HATABS,y ; 7F2D 99 1A 03
+no_e_handler:
+ lda #<START_ADDRESS ; 7F30 A9 00
+ sta MEMTOP ; 7F32 8D E5 02
+ lda #>START_ADDRESS ; 7F35 A9 7A
+ sta MEMTOP+1 ; 7F37 8D E6 02
+ jmp return_success ; 7F3A 4C 31 7D
+
+; ----------------------------------------------------------------------------
+; (when does this actually get called? da65 can't find any references
+; to it, and it's not a run or init address in the binary load file)
+ lda #<dosini_entry_point ; 7F3D A9 F4
+ sta DOSINI ; 7F3F 85 0C
+ lda #>dosini_entry_point ; 7F41 A9 7E
+ sta DOSINI+1 ; 7F43 85 0D
+ jmp main_entry_point ; 7F45 4C F7 7E
+
+; ----------------------------------------------------------------------------
+; Various bits of runtime state here. It's unclear to me why the standard
+; OS buffer location couldn't have been used instead (normally the top
+; half of page 5), or why the other stuff couldn't have been stored in
+; zero page, in locations used by the ROM E: handler (thus unused when
+; it's replaced with COL80). line_buffer_index needs to be preserved
+; across calls to col80_getbyte, but lo_nybble_flag and inverse_mask are
+; freshly calculated every time they're used, so they could be almost
+; anywhere.
+
+lo_nybble_flag:
+ .byte $00 ; 7F48 00
+
+inverse_mask:
+ .byte $00 ; 7F49 00
+
+line_buffer_index:
+ .byte $12 ; 7F4A 12
+
+; ----------------------------------------------------------------------------
+; There's absolutely no reason why this data needs to be included in the
+; binary load file: the line buffer's initial contents are meaningless, they
+; will be blown away the first time anything reads from the E: device.
+
+; Notice the author was running his debugger in COL80 when he built the
+; binary (ASCII "S COL80 7A00 7F80" command still in the buffer).
+
+line_buffer:
+ .byte $53,$20,$43,$4F,$4C,$38,$30,$20 ; 7F4B
+ .byte $37,$41,$30,$30,$20,$37,$46,$38 ; 7F53
+ .byte $30,$9B,$20,$20,$20,$20,$9B,$27 ; 7F5B
+ .byte $40,$40,$40,$40,$28,$28,$28,$28 ; 7F63
+ .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 7F6B
+ .byte $40,$40,$40,$40,$40,$40,$40,$40 ; 7F73
+ .byte $9B,$FD,$FD,$FD,$FD,$9B ; 7F7B
+
+END_ADDRESS = *-1
+
+; I've found a variant (modified version?) of this code, that doesn't
+; include the line_buffer in the file (no reason for it to be there),
+; or the $0C segment, and that has another segment, loaded at $6000,
+; with the run address changed to $6000. The code looks like:
+
+; .org $6000
+; jsr dosini_entry_point
+; lda #$50
+; sta RMARGN
+; lda #$00
+; sta COLOR2
+
+; also, the default colors have been changed in init_graphics_8.
+
+; There are at least two binaries floating around that contain
+; extra (garbage) bytes at the end, presumably from being transferred
+; over XMODEM or similar. They are otherwise identical.
+
diff --git a/src/col80_modified/cruft/col80_main.xex b/src/col80_modified/cruft/col80_main.xex
new file mode 100644
index 0000000..90208c3
--- /dev/null
+++ b/src/col80_modified/cruft/col80_main.xex
Binary files differ
diff --git a/src/col80_modified/cruft/col80_orig.xex b/src/col80_modified/cruft/col80_orig.xex
new file mode 100644
index 0000000..f5f9548
--- /dev/null
+++ b/src/col80_modified/cruft/col80_orig.xex
Binary files differ
diff --git a/src/col80_modified/cruft/col80_runad_seg.s b/src/col80_modified/cruft/col80_runad_seg.s
new file mode 100644
index 0000000..234d621
--- /dev/null
+++ b/src/col80_modified/cruft/col80_runad_seg.s
@@ -0,0 +1,13 @@
+
+; Third segment is the run address
+
+;.ifdef FUJICHAT
+;INITAD = $02E2
+; .word INITAD
+; .word INITAD+1
+; .word dosini_entry_point
+;.else
+ .word RUNAD
+ .word RUNAD+1
+ .word dosini_entry_point
+;.endif
diff --git a/src/col80_modified/cruft/col80_startaddr.s b/src/col80_modified/cruft/col80_startaddr.s
new file mode 100644
index 0000000..d88203b
--- /dev/null
+++ b/src/col80_modified/cruft/col80_startaddr.s
@@ -0,0 +1,7 @@
+
+ .ifdef FUJICHAT
+START_ADDRESS = $9C01 ; subtract $0800 (2048) if using BASIC or other cart
+;START_ADDRESS = $7A00
+ .else
+START_ADDRESS = $7A00
+ .endif
diff --git a/src/col80_modified/cruft/col80_startup.s b/src/col80_modified/cruft/col80_startup.s
new file mode 100644
index 0000000..b170a3c
--- /dev/null
+++ b/src/col80_modified/cruft/col80_startup.s
@@ -0,0 +1,4 @@
+
+ .include "col80_include.s"
+ .include "col80_init.s"
+ .include "col80_entry.s"
diff --git a/src/col80_modified/cruft/dasm2atasm b/src/col80_modified/cruft/dasm2atasm
new file mode 100755
index 0000000..b7ebe66
--- /dev/null
+++ b/src/col80_modified/cruft/dasm2atasm
@@ -0,0 +1,362 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+dasm2atasm - converts 6502 assembly in DASM syntax to ATASM (or MAC/65) format.
+
+=head1 SYNOPSIS
+
+ dasm2atasm mycode.asm
+
+Writes output to I<mycode.m65>
+
+ dasm2atasm stuff.asm other.m65
+
+Reads from I<stuff.asm>, writes to I<other.m65>
+
+=head1 DESCRIPTION
+
+B<dasm2atasm> tries its best to convert DASM's syntax into something
+that B<ATASM> can use. Since B<ATASM>'s syntax is 99% compatible with
+that of B<MAC/65>, B<dasm2atasm> can be used for that as well.
+
+=head1 CAVEATS
+
+There are a few B<DASM> directives that aren't quite supported by
+B<ATASM>.
+
+=over 4
+
+=item echo
+
+In B<DASM> syntax, I<echo> can interpolate values, like so:
+
+ echo $100-*, " bytes of zero page left"
+
+B<ATASM>'s closest equivalent to I<echo> is I<.warn>, but it doesn't
+allow multiple arguments or interpolation. For now, B<dasm2atasm> just
+comments out the line with the I<echo> directive.
+
+=item seg and seg.u
+
+B<ATASM> just plain doesn't support segments. These directives will
+just be commented out. This I<shouldn't> have any effect on the
+object code.
+
+=item sta.w, sty.w, stx.w
+
+B<ATASM> doesn't provide a way to force word addressing, when the operand
+of a store instruction will allow zero page addressing to be used. You'll
+run into this a lot in Atari 2600 code, or any other 6502 code that has to
+maintain sync with an external piece of hardware (using word addressing
+causes the 6502 to use an extra CPU cycle, which is the only way to cause
+a 1-cycle delay).
+
+For now, we're just converting any I<st?.w> instructions to the appropriate
+I<.byte> directives, like so:
+
+ ;;;;; dasm2atasm: was `sta.w COLUPF', using .byte to generate opcode
+ .byte $8d, COLUPF, $00
+
+This works fine if I<COLUPF> is a zero-page label. It's possible, though
+unlikely, that you'll run across code where the programmer has used I<sta.w>
+with a label that would already cause absolute word addressing to be used,
+in which case the extra I<$00> will break our code (literally: I<$00> is
+the I<BRK> instruction!)
+
+This isn't likely to be fixed by I<dasm2atasm>. The correct fix will be to
+support I<sta.w> and friends in B<ATASM> itself, which may happen in the
+future.
+
+=item . (dot)
+
+B<DASM> allows the use of I<.> or I<*> to represent the current program counter
+in expressions. B<ATASM> only allows I<*>, and unless I want to include a
+full expression-parser in B<dasm2atasm>, I can't reliably translate this.
+
+For now, you'll have to fix this yourself. Future versions will at least
+make an attempt, but this one doesn't.
+
+=back
+
+=head1 AUTHOR
+
+B. Watson I<< <urchlay@urchlay.com> >>. Comments & constructive criticism
+welcome, or just a friendly `hello'. Spam will be redirected to /dev/null
+and so will the spammer's entire domain.
+
+=cut
+
+sub usage {
+ print <<EOF;
+Usage: $0 -[aclmr] infile.asm [outfile.m65]
+
+EOF
+ exit 1;
+}
+
+sub get_mac_sub {
+ my $rex = shift;
+ my $code = "sub { s/($rex)/\\U\$1/gio };";
+ #warn "code is $code";
+ return eval "$code";
+}
+
+sub unhex {
+ # makes a proper $xx, $xx, $xx list of bytes
+ # from a list of hex digits, spaces optional.
+ my $bytes = shift;
+ my $ret = "";
+
+ $bytes =~ s/\s//g;
+
+ #warn "unhex: bytes is $bytes";
+
+ for($bytes =~ /(..)/g) {
+ #warn "unhex: found $_";
+ $ret .= "\$$_, ";
+ }
+
+ chop $ret;
+ chop $ret;
+
+ return $ret;
+}
+
+sub fix_include {
+ my $inc = shift;
+ my $old = $inc;
+ $inc =~ s/\.(\w+)("?)$/.m65$2/;
+
+ if($recursive) {
+ system("$cmd $old $inc");
+ } else {
+ warn "Don't forget to convert included file `$old' to .m65 format!\n";
+ }
+ return $inc;
+}
+
+sub do_subs {
+ # Do the dirty work of the substitutions. Only reason we have this
+ # as a subroutine of its own is for profiling purposes (and we do
+ # spend a *lot* of time here!)
+ my $line = shift;
+
+ for($line) {
+ s/^(\@?\w+):/$1/; # no colons after labels, in atasm
+ s/%/~/g; # binary constant
+ s/!=/<>/g; # inequality
+
+ s/^(\s+)\.?echo(.*)/;;;;;$1.warn$2/i &&
+ do { warn "$in, line $.:\n\t`.warn' not fully compatible with dasm's `echo', commented out\n" }
+ && next;
+
+ # This is supposed to change e.g. `bpl .label' to `bpl @label'
+ s/^(\s+)([a-z]{3})(\s+)\.(\w+)/$1$2$3\@$4/i
+ && next;
+
+
+ s/{(\d)}/%$1/g; # macro arg (gotta do this *after* bin. constants!)
+
+# atasm doesn't support shifts, emulate with multiply/divide
+ s/\s*<<\s*(\d+)/"*" . 2**$1/eg;
+ s/\s*>>\s*(\d+)/"\/" . 2**$1/eg;
+
+# atasm chokes sometimes when there's whitespace around an operator
+# unfortunately, a construct like `bne *-1' can't afford to lose the
+# space before the *... why, oh why, does * have to be both multiply and
+# program counter? *sigh*
+
+# s/\s*([-!|\/+*&])\s*/$1/g;
+
+# ARGH. Why does dasm allow `byte #1, #2, #3'... and why do people *use* it?!
+ s/^(\s+)\.?byte(\s+)/$1.byte$2/i && do { s/#//g } && next;
+ s/^(\s+)\.?word(\s+)/$1.word$2/i && do { s/#//g } && next;
+ s/^(\s+)\.?dc\.w(\s+)/$1.word$2/i && do { s/#//g } && next;
+ s/^(\s+)\.?dc(?:\.b)?(\s+)/$1.byte$2/i && do { s/#//g } && next;
+
+# 20070529 bkw: turn ".DS foo" into ".DC foo 0"
+ s/^(\s+)\.?ds(\s+)(\S+)/$1.dc $3 0 /i && do { s/#//g } && next;
+
+# I really want to add `hex' to atasm. 'til then though, fake with .byte
+ s/^(\s+)\.?hex\s+(.*)/$1 . '.byte ' .
+ unhex($2)/ie && next;
+
+ s/^(\s+)\.?subroutine(.*)/$1.local$2/i && next;
+ s/^(\s+)\.?include(\s+)(.*)/$1 . '.include' . $2 . fix_include($3)/gie
+ && next;
+ s/^(\s+)\.?equ\b/$1=/i && next;
+ s/^(\s+)\.?repeat\b/$1.rept/i && next;
+ s/^(\s+)\.?repend\b/$1.endr/i && next;
+ s/^(\s+)\.?endm\b/$1.endm/i && next;
+ s/^(\s+)\.?org(\s+)([^,]*).*$/$1*=$2$3/i && next;
+ s/^(\s+)\.?incbin\b/$1\.incbin/i && next;
+ s/^(\s+)\.?err(.*)/$1.error$2/i && next; # TODO: see if atasm allows `.error' with no message.
+ s/^(\s+)\.?ifconst\s+(.*)/$1.if .def $2/i
+ && next; # TODO: test this!
+ s/^(\s+)\.?else/$1.else/i && next;
+ s/^(\s+)\.?endif/$1.endif/i && next;
+ s/^(\s+)\.?if\s+(.*)/$1.if $2/i && next;
+
+ # stuff that doesn't work:
+ s/^(\s+)(\.?seg(\..)?\s.*)/;;;;; dasm2atasm: `seg' not supported by atasm\n;;;;;$1$2/i
+ && next;
+ s/^(\s+)(\.?processor\s.*)/;;;;; dasm2atasm: `processor' not supported by atasm\n;;;;;$1$2/i
+ && next;
+
+ s/^(\s+)sta\.w(\s+)(.*)/;;;;; dasm2atasm: was `sta.w $3', using .byte to generate opcode\n$1.byte \$8d, <$3, >$3/i
+ && next;
+
+ s/^(\s+)stx\.w(\s+)(.*)/;;;;; dasm2atasm: was `stx.w $3', using .byte to generate opcode\n$1.byte \$8e, <$3, >$3/i
+ && next;
+
+ s/^(\s+)sta\.w(\s+)(.*)/;;;;; dasm2atasm: was `sty.w $3', using .byte to generate opcode\n$1.byte \$8c, <$3, >$3/i
+ && next;
+
+ # atasm lacks `align', so make up for it with a macro
+ if(s/(\s)\.?align(\s+)(.*)/$1ALIGN$2$3/i) {
+ if(!$align_defined) { # only gotta define it if not already defined.
+ for($align_macro) {
+ $_ =~ s/^/($linenum += 10) . " "/gme if $linenum;
+ $_ =~ s/\n/\x9b/g if $a8eol;
+ }
+
+ print OUT $align_macro; # no, I wouldn't use these globals in a CS class assignment.
+ $align_defined++;
+ }
+ next;
+ }
+
+ # macros. This is by far the biggest pain in the ass yet.
+ s/(\s)\.?mac\b/$1.macro/i;
+ if(/(\s)\.macro(\s+)(\w+)/) {
+ $mac_regex .= "|\\b$3\\b";
+ $mac_sub = get_mac_sub($mac_regex);
+ }
+
+ if(ref $mac_sub) { # if we've found at least one macro so far...
+ &$mac_sub; # CAPITALIZE everything matching a macro name
+ } # note: this code assumes macros are *always* defined before they're
+ # used. atasm requires this, but does dasm?
+
+ }
+ return $line;
+}
+
+## main() ##
+
+$ca65 = 0;
+$a8eol = 0;
+$linenum = 0;
+$recursive = 0;
+
+$cmd = $0;
+
+while($ARGV[0] =~ /^-/i) {
+ my $opt = shift;
+ $cmd .= " $opt";
+
+ if($opt eq "-c") {
+ $ca65++;
+ } elsif($opt eq "-a") {
+ $a8eol++;
+ } elsif($opt eq "-l") {
+ $linenum = 1000;
+ } elsif($opt eq "-m") {
+ $a8eol++;
+ $linenum = 1000;
+ } elsif($opt eq "-r") {
+ $recursive++;
+ } elsif($opt eq "--") {
+ last;
+ } else {
+ warn "Unknown option '$opt'\n";
+ usage;
+ }
+}
+
+if($ca65 && ($linenum || $a8eol)) {
+ die "Can't use line numbers and/or Atari EOLs with ca65 output\n";
+}
+
+$align_macro = <<EOF;
+;;;;;; ALIGN macro defined by dasm2atasm
+ .macro ALIGN
+ *= [[*/%1]+1] * %1
+ .endm
+EOF
+
+$align_defined = 0; # we only need to emit the macro definition once.
+
+$in = shift || usage;
+$out = shift;
+
+($out = $in) =~ s/(\.\w+)?$/.m65/ unless $out;
+
+die "$0: can't use $in for both input and output\n" if $out eq $in;
+
+open IN, "<$in" or die "Can't read $in: $!\n";
+open OUT, ">$out" or die "Can't write to $out: $!\n";
+
+$hdr = <<EOF;
+;;; Converted from DASM syntax with command:
+; $cmd $in $out
+
+EOF
+
+for($hdr) {
+ $_ =~ s/^/($linenum += 10) . " "/gme if $linenum;
+ $_ =~ s/\n/\x9b/g if $a8eol;
+}
+
+print OUT $hdr;
+
+if($ca65) {
+ print OUT <<EOF;
+;;; ca65 features enabled by dasm2atasm
+; To build with ca65:
+; ca65 -o foo.o -t none foo.asm
+; ld65 -o foo.bin -t none foo.o
+.FEATURE pc_assignment
+.FEATURE labels_without_colons
+
+EOF
+}
+
+$mac_regex = "!THIS_ISNT_SUPPOSED_TO_MATCH";
+$mac_sub = ""; # this will be the code ref we call to match $mac_regex
+
+while(<IN>) {
+ chomp;
+ s/\r//; # you might not want this on dos/win, not sure if it matters.
+ $label = "";
+
+ if(/^(\w+)\s*=\s*\1/i) {
+ print OUT ";;;;; dasm2atasm: labels are case-insensitive in atasm\n";
+ $line = ";;;;; $_ ; This assignment is an error in atasm";
+ next;
+ }
+
+# do this before we split out the label:
+ s/^\./\@/; # local label (dot in dasm, @ in atasm)
+
+ if(s/^([^:;\s]*):?(\s+)/$2/) {
+ $label = $1;
+ }
+
+ ($line, $comment) = split /;/, $_, 2;
+ next unless $line;
+
+ $line = do_subs($line);
+
+} continue {
+ if($linenum) {
+ print OUT "$linenum ";
+ $linenum += 10;
+ }
+
+ print OUT $label if $label;
+ print OUT $line if $line;
+ print OUT ";$comment" if $comment;
+ print OUT ($a8eol ? "\x9b" : "\n");
+}
diff --git a/src/col80_modified/cruft/dos_20s.atr b/src/col80_modified/cruft/dos_20s.atr
new file mode 100755
index 0000000..8016b73
--- /dev/null
+++ b/src/col80_modified/cruft/dos_20s.atr
Binary files differ
diff --git a/src/col80_modified/cruft/font.bin b/src/col80_modified/cruft/font.bin
new file mode 100644
index 0000000..d2fd3d4
--- /dev/null
+++ b/src/col80_modified/cruft/font.bin
Binary files differ
diff --git a/src/col80_modified/cruft/font.s b/src/col80_modified/cruft/font.s
new file mode 100644
index 0000000..78266ea
--- /dev/null
+++ b/src/col80_modified/cruft/font.s
@@ -0,0 +1,54 @@
+ .org 1000
+ ; Space ! " # etc (codes 32-63)
+ .byte $00,$04,$04,$04,$04,$00,$04,$00
+ .byte $00,$A0,$AA,$AE,$0A,$0E,$0A,$00
+ .byte $00,$40,$68,$82,$44,$28,$C2,$40
+ .byte $00,$C4,$64,$E4,$60,$C0,$40,$00
+ .byte $00,$44,$82,$82,$82,$82,$82,$44
+ .byte $00,$04,$A4,$4E,$E4,$44,$A0,$00
+ .byte $00,$00,$00,$0E,$00,$40,$40,$80
+ .byte $00,$02,$02,$04,$04,$08,$48,$00
+ .byte $00,$E4,$AC,$A4,$A4,$A4,$EE,$00
+ .byte $00,$EE,$22,$22,$EE,$82,$EE,$00
+ .byte $00,$AE,$A8,$AE,$E2,$22,$2E,$00
+ .byte $00,$EE,$82,$E2,$A4,$A4,$E4,$00
+ .byte $00,$EE,$AA,$EA,$AE,$A2,$EE,$00
+ .byte $00,$00,$00,$44,$00,$44,$04,$08
+ .byte $00,$20,$4E,$80,$4E,$20,$00,$00
+ .byte $00,$8C,$42,$22,$44,$80,$04,$00
+
+ ; @ A B C etc (codes 64-95)
+ .byte $00,$6E,$9A,$BA,$BE,$8A,$6A,$00
+ .byte $00,$C6,$A8,$C8,$A8,$A8,$C6,$00
+ .byte $00,$CE,$A8,$AC,$A8,$A8,$CE,$00
+ .byte $00,$E6,$88,$C8,$8A,$8A,$86,$00
+ .byte $00,$AE,$A4,$E4,$A4,$A4,$AE,$00
+ .byte $00,$2A,$2A,$2C,$2A,$2A,$CA,$00
+ .byte $00,$8A,$8E,$8E,$8A,$8A,$EA,$00
+ .byte $00,$C4,$AA,$AA,$AA,$AA,$A4,$00
+ .byte $00,$EE,$AA,$EA,$8A,$8A,$8E,$03
+ .byte $00,$C6,$A8,$AC,$C2,$A2,$AC,$00
+ .byte $00,$EA,$4A,$4A,$4A,$4A,$4E,$00
+ .byte $00,$AA,$AA,$AA,$AE,$AE,$4A,$00
+ .byte $00,$AA,$4A,$4E,$44,$44,$A4,$00
+ .byte $00,$EE,$28,$48,$88,$88,$E8,$0E
+ .byte $00,$8E,$82,$42,$42,$22,$22,$0E
+ .byte $00,$00,$40,$A0,$00,$00,$00,$0F
+
+ ; diamond, lowercase letters, control codes (codes 96-127)
+ .byte $00,$00,$00,$46,$E2,$4E,$0E,$00
+ .byte $00,$80,$80,$C6,$A8,$A8,$C6,$00
+ .byte $00,$20,$20,$6E,$AE,$A8,$6E,$00
+ .byte $00,$00,$C0,$86,$CA,$8E,$82,$0C
+ .byte $00,$80,$84,$80,$C4,$A4,$A4,$00
+ .byte $00,$08,$28,$0A,$2C,$2A,$2A,$C0
+ .byte $00,$40,$40,$4A,$4E,$4A,$4A,$00
+ .byte $00,$00,$00,$CE,$AA,$AA,$AE,$00
+ .byte $00,$00,$00,$C6,$AA,$C6,$82,$82
+ .byte $00,$00,$00,$6E,$88,$86,$8E,$00
+ .byte $00,$00,$40,$EA,$4A,$4A,$6E,$00
+ .byte $00,$00,$00,$AA,$AA,$AE,$4A,$00
+ .byte $00,$00,$00,$AA,$4A,$A6,$A2,$0C
+ .byte $00,$00,$04,$EE,$4E,$84,$EE,$00
+ .byte $40,$4E,$4C,$4E,$4A,$42,$42,$40
+ .byte $00,$28,$6C,$EE,$6C,$28,$00,$00
diff --git a/src/col80_modified/cruft/font2xbm.pl b/src/col80_modified/cruft/font2xbm.pl
new file mode 100644
index 0000000..3337139
--- /dev/null
+++ b/src/col80_modified/cruft/font2xbm.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+
+use bytes;
+
+$name = "xbm";
+$width = 8;
+$height = 384;
+$cwidth = $width / 8;
+$cheight = $height / 8;
+
+print <<EOF;
+#define ${name}_width ${width}
+#define ${name}_height ${height}
+static unsigned char ${name}_bits[] = {
+EOF
+
+undef $/;
+$_ = <>;
+@inbytes = split "";
+
+# reverse bits, print 12 bytes/line
+
+$c = 0;
+for($i=0; $i<@inbytes; $i++) {
+ $byte = ord $inbytes[$i];
+ if(!$c) {
+ print " ";
+ }
+
+ printf "0x%02x", reverse_bits($byte);
+ if($i != $#inbytes) {
+ if($c == 12) {
+ print ",\n";
+ $c = 0;
+ } else {
+ print ", ";
+ $c++;
+ }
+ }
+}
+
+print " };\n";
+
+sub reverse_bits {
+ my $bitstr = reverse sprintf("%08b", $_[0]);
+ return eval "0b$bitstr";
+}
diff --git a/src/col80_modified/cruft/new_font.s b/src/col80_modified/cruft/new_font.s
new file mode 100644
index 0000000..f70ae8b
--- /dev/null
+++ b/src/col80_modified/cruft/new_font.s
@@ -0,0 +1,48 @@
+ .byte $00,$04,$04,$04,$04,$00,$04,$00
+ .byte $00,$A0,$AA,$AE,$0A,$0E,$0A,$00
+ .byte $00,$40,$68,$82,$44,$28,$C2,$40
+ .byte $00,$44,$E4,$84,$60,$80,$E0,$40
+ .byte $00,$44,$82,$82,$82,$82,$82,$44
+ .byte $00,$00,$A4,$44,$EE,$44,$A4,$00
+ .byte $00,$00,$00,$0E,$00,$40,$40,$80
+ .byte $00,$02,$02,$04,$04,$08,$48,$00
+ .byte $00,$E4,$AC,$A4,$A4,$A4,$EE,$00
+ .byte $00,$EE,$22,$22,$EE,$82,$EE,$00
+ .byte $00,$AE,$A8,$AE,$E2,$22,$2E,$00
+ .byte $00,$EE,$82,$E2,$A4,$A4,$E4,$00
+ .byte $00,$EE,$AA,$EA,$AE,$A2,$EE,$00
+ .byte $00,$00,$00,$44,$00,$44,$04,$08
+ .byte $00,$20,$4E,$80,$4E,$20,$00,$00
+ .byte $00,$8C,$42,$22,$44,$80,$04,$00
+ .byte $00,$6E,$9A,$BA,$BE,$8A,$6A,$00
+ .byte $00,$C6,$A8,$C8,$A8,$A8,$C6,$00
+ .byte $00,$CE,$A8,$AC,$A8,$A8,$CE,$00
+ .byte $00,$E6,$88,$C8,$8A,$8A,$86,$00
+ .byte $00,$AE,$A4,$E4,$A4,$A4,$AE,$00
+ .byte $00,$2A,$2A,$2C,$2A,$2A,$CA,$00
+ .byte $00,$8A,$8E,$8E,$8A,$8A,$EA,$00
+ .byte $00,$C4,$AA,$AA,$AA,$AA,$A4,$00
+ .byte $00,$EE,$AA,$EA,$8A,$8A,$8E,$03
+ .byte $00,$C6,$A8,$AC,$C2,$A2,$AC,$00
+ .byte $00,$EA,$4A,$4A,$4A,$4A,$4E,$00
+ .byte $00,$AA,$AA,$AA,$AE,$AE,$4A,$00
+ .byte $00,$AA,$4A,$4E,$44,$44,$A4,$00
+ .byte $00,$EE,$28,$48,$88,$88,$E8,$0E
+ .byte $00,$8E,$82,$42,$42,$22,$22,$0E
+ .byte $00,$00,$40,$A0,$00,$00,$00,$0F
+ .byte $00,$00,$0C,$42,$E6,$4A,$0E,$00
+ .byte $00,$80,$80,$C6,$A8,$A8,$C6,$00
+ .byte $00,$20,$26,$6A,$AE,$A8,$6E,$00
+ .byte $00,$00,$C0,$86,$CA,$8E,$82,$0C
+ .byte $00,$80,$84,$80,$C4,$A4,$A4,$00
+ .byte $00,$08,$28,$0A,$2C,$2A,$2A,$C0
+ .byte $00,$40,$40,$4A,$4E,$4A,$4A,$00
+ .byte $00,$00,$00,$CE,$AA,$AA,$AE,$00
+ .byte $00,$00,$00,$C6,$AA,$C6,$82,$83
+ .byte $00,$00,$00,$6E,$88,$86,$8E,$00
+ .byte $00,$00,$40,$EA,$4A,$4A,$6E,$00
+ .byte $00,$00,$00,$AA,$AA,$AE,$4A,$00
+ .byte $00,$00,$00,$AA,$4A,$A6,$A2,$0C
+ .byte $00,$06,$04,$E4,$48,$84,$E4,$06
+ .byte $40,$4C,$44,$44,$42,$44,$44,$4C
+ .byte $00,$08,$5C,$AE,$0C,$08,$00,$00
diff --git a/src/col80_modified/cruft/new_font.xbm b/src/col80_modified/cruft/new_font.xbm
new file mode 100644
index 0000000..a7fab38
--- /dev/null
+++ b/src/col80_modified/cruft/new_font.xbm
@@ -0,0 +1,35 @@
+#define font_width 8
+#define font_height 384
+static unsigned char font_bits[] = {
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x05, 0x55, 0x75,
+ 0x50, 0x70, 0x50, 0x00, 0x00, 0x02, 0x16, 0x41, 0x22, 0x14, 0x43, 0x02,
+ 0x00, 0x22, 0x27, 0x21, 0x06, 0x01, 0x07, 0x02, 0x00, 0x22, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x22, 0x00, 0x00, 0x25, 0x22, 0x77, 0x22, 0x25, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x02, 0x02, 0x01, 0x00, 0x40, 0x40, 0x20,
+ 0x20, 0x10, 0x12, 0x00, 0x00, 0x27, 0x35, 0x25, 0x25, 0x25, 0x77, 0x00,
+ 0x00, 0x77, 0x44, 0x44, 0x77, 0x41, 0x77, 0x00, 0x00, 0x75, 0x15, 0x75,
+ 0x47, 0x44, 0x74, 0x00, 0x00, 0x77, 0x41, 0x47, 0x25, 0x25, 0x27, 0x00,
+ 0x00, 0x77, 0x55, 0x57, 0x75, 0x45, 0x77, 0x00, 0x00, 0x00, 0x00, 0x22,
+ 0x00, 0x22, 0x20, 0x10, 0x00, 0x04, 0x72, 0x01, 0x72, 0x04, 0x00, 0x00,
+ 0x00, 0x31, 0x42, 0x44, 0x22, 0x01, 0x20, 0x00, 0x00, 0x76, 0x59, 0x5d,
+ 0x7d, 0x51, 0x56, 0x00, 0x00, 0x63, 0x15, 0x13, 0x15, 0x15, 0x63, 0x00,
+ 0x00, 0x73, 0x15, 0x35, 0x15, 0x15, 0x73, 0x00, 0x00, 0x67, 0x11, 0x13,
+ 0x51, 0x51, 0x61, 0x00, 0x00, 0x75, 0x25, 0x27, 0x25, 0x25, 0x75, 0x00,
+ 0x00, 0x54, 0x54, 0x34, 0x54, 0x54, 0x53, 0x00, 0x00, 0x51, 0x71, 0x71,
+ 0x51, 0x51, 0x57, 0x00, 0x00, 0x23, 0x55, 0x55, 0x55, 0x55, 0x25, 0x00,
+ 0x00, 0x77, 0x55, 0x57, 0x51, 0x51, 0x71, 0xc0, 0x00, 0x63, 0x15, 0x35,
+ 0x43, 0x45, 0x35, 0x00, 0x00, 0x57, 0x52, 0x52, 0x52, 0x52, 0x72, 0x00,
+ 0x00, 0x55, 0x55, 0x55, 0x75, 0x75, 0x52, 0x00, 0x00, 0x55, 0x52, 0x72,
+ 0x22, 0x22, 0x25, 0x00, 0x00, 0x77, 0x14, 0x12, 0x11, 0x11, 0x17, 0x70,
+ 0x00, 0x71, 0x41, 0x42, 0x42, 0x44, 0x44, 0x70, 0x00, 0x00, 0x02, 0x05,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x30, 0x42, 0x67, 0x52, 0x70, 0x00,
+ 0x00, 0x01, 0x01, 0x63, 0x15, 0x15, 0x63, 0x00, 0x00, 0x04, 0x64, 0x56,
+ 0x75, 0x15, 0x76, 0x00, 0x00, 0x00, 0x03, 0x61, 0x53, 0x71, 0x41, 0x30,
+ 0x00, 0x01, 0x21, 0x01, 0x23, 0x25, 0x25, 0x00, 0x00, 0x10, 0x14, 0x50,
+ 0x34, 0x54, 0x54, 0x03, 0x00, 0x02, 0x02, 0x52, 0x72, 0x52, 0x52, 0x00,
+ 0x00, 0x00, 0x00, 0x73, 0x55, 0x55, 0x75, 0x00, 0x00, 0x00, 0x00, 0x63,
+ 0x55, 0x63, 0x41, 0xc1, 0x00, 0x00, 0x00, 0x76, 0x11, 0x61, 0x71, 0x00,
+ 0x00, 0x00, 0x02, 0x57, 0x52, 0x52, 0x76, 0x00, 0x00, 0x00, 0x00, 0x55,
+ 0x55, 0x75, 0x52, 0x00, 0x00, 0x00, 0x00, 0x55, 0x52, 0x65, 0x45, 0x30,
+ 0x00, 0x60, 0x20, 0x27, 0x12, 0x21, 0x27, 0x60, 0x02, 0x32, 0x22, 0x22,
+ 0x42, 0x22, 0x22, 0x32, 0x00, 0x10, 0x3a, 0x75, 0x30, 0x10, 0x00, 0x00 };
diff --git a/src/col80_modified/cruft/test.atr b/src/col80_modified/cruft/test.atr
new file mode 100755
index 0000000..0127b33
--- /dev/null
+++ b/src/col80_modified/cruft/test.atr
Binary files differ
diff --git a/src/col80_modified/cruft/xbm2font.pl b/src/col80_modified/cruft/xbm2font.pl
new file mode 100644
index 0000000..758d57e
--- /dev/null
+++ b/src/col80_modified/cruft/xbm2font.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+use bytes;
+
+$c = 0;
+
+while(<>) {
+ next unless @bytes = (/0x([0-9a-fA-F]{2})/g);
+ for(@bytes) {
+ if(!($c % 8)) {
+ print " .byte ";
+ }
+
+ printf "\$%02X", reverse_bits(hex $_);
+
+ if(($c % 8 == 7) || ($c == $#bytes)) {
+ print "\n";
+ $c = 0;
+ } else {
+ print ",";
+ $c++;
+ }
+ }
+}
+
+sub reverse_bits {
+ my $bitstr = reverse sprintf("%08b", $_[0]);
+ return eval "0b$bitstr";
+}
diff --git a/src/col80_modified/dos_20s.atr b/src/col80_modified/dos_20s.atr
new file mode 100755
index 0000000..8016b73
--- /dev/null
+++ b/src/col80_modified/dos_20s.atr
Binary files differ
diff --git a/src/col80_modified/font2xbm.pl b/src/col80_modified/font2xbm.pl
new file mode 100644
index 0000000..c0ec3be
--- /dev/null
+++ b/src/col80_modified/font2xbm.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+use bytes;
+
+$name = "xbm";
+$width = 8;
+$height = 384;
+#$height = 512;
+$cwidth = $width / 8;
+$cheight = $height / 8;
+
+print <<EOF;
+#define ${name}_width ${width}
+#define ${name}_height ${height}
+static unsigned char ${name}_bits[] = {
+EOF
+
+undef $/;
+$_ = <>;
+@inbytes = split "";
+
+# reverse bits, print 12 bytes/line
+
+$c = 0;
+for($i=0; $i<@inbytes; $i++) {
+ $byte = ord $inbytes[$i];
+ if(!$c) {
+ print " ";
+ }
+
+ printf "0x%02x", reverse_bits($byte);
+ if($i != $#inbytes) {
+ if($c == 12) {
+ print ",\n";
+ $c = 0;
+ } else {
+ print ", ";
+ $c++;
+ }
+ }
+}
+
+print " };\n";
+
+sub reverse_bits {
+ my $bitstr = reverse sprintf("%08b", $_[0]);
+ return eval "0b$bitstr";
+}
diff --git a/src/col80_modified/icet.xbm b/src/col80_modified/icet.xbm
new file mode 100644
index 0000000..946753b
--- /dev/null
+++ b/src/col80_modified/icet.xbm
@@ -0,0 +1,43 @@
+#define xbm_width 8
+#define xbm_height 512
+static unsigned char xbm_bits[] = {
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x55, 0x75, 0x50, 0x70,
+ 0x50, 0x00, 0x00, 0x02, 0x16, 0x41, 0x22, 0x14, 0x43, 0x02, 0x00, 0x00, 0x42,
+ 0x25, 0x02, 0x05, 0x02, 0x04, 0x00, 0x00, 0x14, 0x22, 0x22, 0x22, 0x22, 0x14,
+ 0x00, 0x00, 0x25, 0x22, 0x77, 0x22, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+ 0x00, 0x02, 0x02, 0x01, 0x00, 0x40, 0x40, 0x20, 0x20, 0x12, 0x12, 0x00, 0x00,
+ 0x22, 0x35, 0x25, 0x25, 0x25, 0x72, 0x00, 0x00, 0x32, 0x45, 0x34, 0x42, 0x41,
+ 0x37, 0x00, 0x00, 0x75, 0x15, 0x35, 0x46, 0x44, 0x34, 0x00, 0x00, 0x72, 0x41,
+ 0x23, 0x25, 0x15, 0x12, 0x00, 0x00, 0x22, 0x55, 0x52, 0x65, 0x45, 0x22, 0x00,
+ 0x00, 0x00, 0x22, 0x00, 0x20, 0x22, 0x10, 0x00, 0x00, 0x04, 0x72, 0x01, 0x72,
+ 0x04, 0x00, 0x00, 0x00, 0x21, 0x52, 0x44, 0x22, 0x01, 0x20, 0x00, 0x00, 0x22,
+ 0x57, 0x57, 0x75, 0x51, 0x56, 0x00, 0x00, 0x63, 0x15, 0x13, 0x15, 0x15, 0x67,
+ 0x00, 0x00, 0x73, 0x15, 0x75, 0x15, 0x15, 0x73, 0x00, 0x00, 0x67, 0x11, 0x17,
+ 0x51, 0x51, 0x61, 0x00, 0x00, 0x75, 0x25, 0x27, 0x25, 0x25, 0x75, 0x00, 0x00,
+ 0x56, 0x54, 0x34, 0x54, 0x55, 0x52, 0x00, 0x00, 0x51, 0x71, 0x51, 0x51, 0x51,
+ 0x57, 0x00, 0x00, 0x74, 0x55, 0x57, 0x57, 0x55, 0x71, 0x00, 0x00, 0x73, 0x55,
+ 0x55, 0x53, 0x71, 0x41, 0x00, 0x00, 0x63, 0x15, 0x23, 0x45, 0x45, 0x35, 0x00,
+ 0x00, 0x57, 0x52, 0x52, 0x52, 0x52, 0x72, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55,
+ 0x72, 0x52, 0x00, 0x00, 0x55, 0x55, 0x52, 0x22, 0x25, 0x25, 0x00, 0x00, 0x67,
+ 0x24, 0x22, 0x21, 0x21, 0x67, 0x00, 0x00, 0x31, 0x21, 0x22, 0x22, 0x24, 0x34,
+ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x70, 0x00, 0x25, 0x2a, 0x25, 0xea,
+ 0x25, 0x2a, 0x25, 0x2a, 0x28, 0x28, 0x28, 0x38, 0x08, 0x08, 0x08, 0x08, 0x02,
+ 0x02, 0x02, 0x33, 0x22, 0x22, 0x22, 0x22, 0x00, 0x22, 0x52, 0x27, 0x07, 0x02,
+ 0x02, 0x00, 0x00, 0x42, 0x27, 0x12, 0x20, 0x47, 0x70, 0x00, 0x00, 0x01, 0xf2,
+ 0x54, 0x52, 0x51, 0x57, 0x00, 0x00, 0x24, 0x37, 0x22, 0x77, 0x21, 0x70, 0x00,
+ 0xf0, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x01, 0x01, 0xf1, 0x21, 0x21, 0x21,
+ 0x21, 0x02, 0x02, 0x02, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xa2, 0xd2, 0xf2, 0xde,
+ 0x00, 0x10, 0x10, 0x50, 0x00, 0x00, 0x18, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00,
+ 0x08, 0x4c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x34, 0x40, 0x70, 0x50,
+ 0x70, 0x00, 0x00, 0x01, 0x61, 0x13, 0x15, 0x15, 0x63, 0x00, 0x00, 0x04, 0x24,
+ 0x56, 0x75, 0x15, 0x66, 0x00, 0x00, 0x06, 0x61, 0x57, 0x51, 0x61, 0x41, 0x30,
+ 0x00, 0x21, 0x01, 0x33, 0x25, 0x25, 0x65, 0x00, 0x00, 0x14, 0x10, 0x54, 0x34,
+ 0x54, 0x54, 0x03, 0x00, 0x03, 0x52, 0x72, 0x52, 0x52, 0x56, 0x00, 0x00, 0x00,
+ 0x23, 0x55, 0x55, 0x55, 0x25, 0x00, 0x00, 0x00, 0x63, 0x55, 0x55, 0x63, 0x41,
+ 0x41, 0x00, 0x00, 0x66, 0x11, 0x21, 0x41, 0x31, 0x00, 0x00, 0x02, 0x57, 0x52,
+ 0x52, 0x52, 0x76, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x72, 0x52, 0x00, 0x00,
+ 0x00, 0x55, 0x55, 0x52, 0x65, 0x45, 0x30, 0x00, 0x60, 0x27, 0x14, 0x22, 0x21,
+ 0x67, 0x00, 0x02, 0x32, 0x22, 0x42, 0x22, 0x22, 0x32, 0x02, 0x0f, 0x2f, 0x2f,
+ 0x2f, 0x2f, 0x2f, 0x2f, 0x0f };
diff --git a/src/col80_modified/icet_packed.fnt b/src/col80_modified/icet_packed.fnt
new file mode 100644
index 0000000..2b599b8
--- /dev/null
+++ b/src/col80_modified/icet_packed.fnt
Binary files differ
diff --git a/src/col80_modified/icet_to_col80 b/src/col80_modified/icet_to_col80
new file mode 100755
index 0000000..9dac02c
--- /dev/null
+++ b/src/col80_modified/icet_to_col80
Binary files differ
diff --git a/src/col80_modified/icet_to_col80.c b/src/col80_modified/icet_to_col80.c
new file mode 100644
index 0000000..aa07223
--- /dev/null
+++ b/src/col80_modified/icet_to_col80.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+
+int main(int argc, char **argv) {
+ int c, d, byte = 0;
+ char out[8];
+
+ do {
+ c = getchar();
+ if(byte == 16) {
+ for(byte = 0; byte < 8; ++byte)
+ putchar(out[byte]);
+
+ byte = 0;
+ }
+
+ if(c != EOF) {
+ if(byte < 8) {
+ out[byte] = (c & 0xf0);
+ ++byte;
+ } else if(byte < 16) {
+ out[byte - 8] |= (c & 0x0f);
+ ++byte;
+ }
+ }
+ } while(c != EOF);
+}
diff --git a/src/col80_modified/icet_vt.fnt b/src/col80_modified/icet_vt.fnt
new file mode 100644
index 0000000..7c29cd1
--- /dev/null
+++ b/src/col80_modified/icet_vt.fnt
Binary files differ
diff --git a/src/col80_modified/icetmod.raw b/src/col80_modified/icetmod.raw
new file mode 100644
index 0000000..59e1331
--- /dev/null
+++ b/src/col80_modified/icetmod.raw
Binary files differ
diff --git a/src/col80_modified/icetmod.s b/src/col80_modified/icetmod.s
new file mode 100644
index 0000000..0c11274
--- /dev/null
+++ b/src/col80_modified/icetmod.s
@@ -0,0 +1,48 @@
+ .byte $00,$02,$02,$02,$02,$00,$02,$00
+ .byte $00,$55,$57,$05,$07,$05,$00,$00
+ .byte $20,$34,$41,$22,$14,$61,$20,$00
+ .byte $20,$31,$42,$30,$40,$30,$20,$00
+ .byte $00,$14,$22,$22,$22,$22,$14,$00
+ .byte $00,$52,$22,$77,$22,$52,$00,$00
+ .byte $00,$00,$00,$07,$00,$20,$20,$40
+ .byte $00,$01,$01,$02,$02,$24,$24,$00
+ .byte $00,$22,$56,$52,$52,$52,$27,$00
+ .byte $00,$26,$51,$16,$21,$41,$76,$00
+ .byte $00,$57,$54,$56,$31,$11,$16,$00
+ .byte $00,$27,$41,$62,$52,$54,$24,$00
+ .byte $00,$22,$55,$25,$53,$51,$22,$00
+ .byte $00,$00,$22,$00,$02,$22,$04,$00
+ .byte $00,$10,$27,$40,$27,$10,$00,$00
+ .byte $00,$42,$25,$11,$22,$40,$02,$00
+ .byte $00,$22,$75,$75,$57,$45,$35,$00
+ .byte $00,$63,$54,$64,$54,$54,$73,$00
+ .byte $00,$67,$54,$57,$54,$54,$67,$00
+ .byte $00,$73,$44,$74,$45,$45,$43,$00
+ .byte $00,$57,$52,$72,$52,$52,$57,$00
+ .byte $00,$35,$15,$16,$15,$55,$25,$00
+ .byte $00,$4A,$4F,$4F,$49,$49,$79,$00
+ .byte $00,$67,$55,$55,$55,$55,$57,$00
+ .byte $00,$67,$55,$55,$65,$47,$41,$00
+ .byte $00,$63,$54,$62,$51,$51,$56,$00
+ .byte $00,$75,$25,$25,$25,$25,$27,$00
+ .byte $00,$59,$59,$59,$5F,$2F,$2A,$00
+ .byte $00,$55,$55,$25,$22,$52,$52,$00
+ .byte $00,$73,$12,$22,$42,$42,$73,$00
+ .byte $00,$46,$42,$22,$22,$12,$16,$00
+ .byte $00,$20,$50,$00,$00,$00,$07,$00
+ .byte $00,$20,$16,$01,$07,$05,$07,$00
+ .byte $00,$40,$43,$64,$54,$54,$63,$00
+ .byte $00,$10,$12,$35,$57,$54,$33,$00
+ .byte $00,$30,$43,$75,$45,$43,$41,$06
+ .byte $00,$42,$40,$66,$52,$52,$53,$00
+ .byte $00,$14,$04,$15,$16,$15,$15,$60
+ .byte $00,$60,$25,$27,$25,$25,$35,$00
+ .byte $00,$00,$62,$55,$55,$55,$52,$00
+ .byte $00,$00,$63,$55,$55,$63,$41,$41
+ .byte $00,$00,$33,$44,$42,$41,$46,$00
+ .byte $00,$20,$75,$25,$25,$25,$37,$00
+ .byte $00,$00,$55,$55,$55,$27,$25,$00
+ .byte $00,$00,$55,$55,$25,$53,$51,$06
+ .byte $00,$03,$72,$14,$22,$42,$73,$00
+ .byte $20,$26,$22,$21,$22,$22,$26,$20
+ .byte $07,$01,$54,$A1,$04,$01,$04,$07
diff --git a/src/col80_modified/icetmod.xbm b/src/col80_modified/icetmod.xbm
new file mode 100644
index 0000000..fb61a13
--- /dev/null
+++ b/src/col80_modified/icetmod.xbm
@@ -0,0 +1,35 @@
+#define icetmod_width 8
+#define icetmod_height 384
+static unsigned char icetmod_bits[] = {
+ 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0xaa, 0xea, 0xa0,
+ 0xe0, 0xa0, 0x00, 0x00, 0x04, 0x2c, 0x82, 0x44, 0x28, 0x86, 0x04, 0x00,
+ 0x04, 0x8c, 0x42, 0x0c, 0x02, 0x0c, 0x04, 0x00, 0x00, 0x28, 0x44, 0x44,
+ 0x44, 0x44, 0x28, 0x00, 0x00, 0x4a, 0x44, 0xee, 0x44, 0x4a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0x00, 0x04, 0x04, 0x02, 0x00, 0x80, 0x80, 0x40,
+ 0x40, 0x24, 0x24, 0x00, 0x00, 0x44, 0x6a, 0x4a, 0x4a, 0x4a, 0xe4, 0x00,
+ 0x00, 0x64, 0x8a, 0x68, 0x84, 0x82, 0x6e, 0x00, 0x00, 0xea, 0x2a, 0x6a,
+ 0x8c, 0x88, 0x68, 0x00, 0x00, 0xe4, 0x82, 0x46, 0x4a, 0x2a, 0x24, 0x00,
+ 0x00, 0x44, 0xaa, 0xa4, 0xca, 0x8a, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00,
+ 0x40, 0x44, 0x20, 0x00, 0x00, 0x08, 0xe4, 0x02, 0xe4, 0x08, 0x00, 0x00,
+ 0x00, 0x42, 0xa4, 0x88, 0x44, 0x02, 0x40, 0x00, 0x00, 0x44, 0xae, 0xae,
+ 0xea, 0xa2, 0xac, 0x00, 0x00, 0xc6, 0x2a, 0x26, 0x2a, 0x2a, 0xce, 0x00,
+ 0x00, 0xe6, 0x2a, 0xea, 0x2a, 0x2a, 0xe6, 0x00, 0x00, 0xce, 0x22, 0x2e,
+ 0xa2, 0xa2, 0xc2, 0x00, 0x00, 0xea, 0x4a, 0x4e, 0x4a, 0x4a, 0xea, 0x00,
+ 0x00, 0xac, 0xa8, 0x68, 0xa8, 0xaa, 0xa4, 0x00, 0x00, 0x52, 0xf2, 0xf2,
+ 0x92, 0x92, 0x9e, 0x00, 0x00, 0xe6, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0x00,
+ 0x00, 0xe6, 0xaa, 0xaa, 0xa6, 0xe2, 0x82, 0x00, 0x00, 0xc6, 0x2a, 0x46,
+ 0x8a, 0x8a, 0x6a, 0x00, 0x00, 0xae, 0xa4, 0xa4, 0xa4, 0xa4, 0xe4, 0x00,
+ 0x00, 0x9a, 0x9a, 0x9a, 0xfa, 0xf4, 0x54, 0x00, 0x00, 0xaa, 0xaa, 0xa4,
+ 0x44, 0x4a, 0x4a, 0x00, 0x00, 0xce, 0x48, 0x44, 0x42, 0x42, 0xce, 0x00,
+ 0x00, 0x62, 0x42, 0x44, 0x44, 0x48, 0x68, 0x00, 0x00, 0x04, 0x0a, 0x00,
+ 0x00, 0x00, 0xe0, 0x00, 0x00, 0x04, 0x68, 0x80, 0xe0, 0xa0, 0xe0, 0x00,
+ 0x00, 0x02, 0xc2, 0x26, 0x2a, 0x2a, 0xc6, 0x00, 0x00, 0x08, 0x48, 0xac,
+ 0xea, 0x2a, 0xcc, 0x00, 0x00, 0x0c, 0xc2, 0xae, 0xa2, 0xc2, 0x82, 0x60,
+ 0x00, 0x42, 0x02, 0x66, 0x4a, 0x4a, 0xca, 0x00, 0x00, 0x28, 0x20, 0xa8,
+ 0x68, 0xa8, 0xa8, 0x06, 0x00, 0x06, 0xa4, 0xe4, 0xa4, 0xa4, 0xac, 0x00,
+ 0x00, 0x00, 0x46, 0xaa, 0xaa, 0xaa, 0x4a, 0x00, 0x00, 0x00, 0xc6, 0xaa,
+ 0xaa, 0xc6, 0x82, 0x82, 0x00, 0x00, 0xcc, 0x22, 0x42, 0x82, 0x62, 0x00,
+ 0x00, 0x04, 0xae, 0xa4, 0xa4, 0xa4, 0xec, 0x00, 0x00, 0x00, 0xaa, 0xaa,
+ 0xaa, 0xe4, 0xa4, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xa4, 0xca, 0x8a, 0x60,
+ 0x00, 0xc0, 0x4e, 0x28, 0x44, 0x42, 0xce, 0x00, 0x04, 0x64, 0x44, 0x84,
+ 0x44, 0x44, 0x64, 0x04, 0xe0, 0x80, 0x2a, 0x85, 0x20, 0x80, 0x20, 0xe0 };
diff --git a/src/col80_modified/icetmod_maybe.xbm b/src/col80_modified/icetmod_maybe.xbm
new file mode 100644
index 0000000..60bc84c
--- /dev/null
+++ b/src/col80_modified/icetmod_maybe.xbm
@@ -0,0 +1,35 @@
+#define icetmod_width 8
+#define icetmod_height 384
+static unsigned char icetmod_bits[] = {
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x55, 0x75, 0x50,
+ 0x70, 0x50, 0x00, 0x00, 0x02, 0x16, 0x41, 0x22, 0x14, 0x43, 0x02, 0x00,
+ 0x02, 0x46, 0x21, 0x06, 0x01, 0x06, 0x02, 0x00, 0x00, 0x14, 0x22, 0x22,
+ 0x22, 0x22, 0x14, 0x00, 0x00, 0x25, 0x22, 0x77, 0x22, 0x25, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x02, 0x02, 0x01, 0x00, 0x40, 0x40, 0x20,
+ 0x20, 0x12, 0x12, 0x00, 0x00, 0x22, 0x35, 0x25, 0x25, 0x25, 0x72, 0x00,
+ 0x00, 0x32, 0x45, 0x34, 0x42, 0x41, 0x37, 0x00, 0x00, 0x75, 0x15, 0x35,
+ 0x46, 0x44, 0x34, 0x00, 0x00, 0x72, 0x41, 0x23, 0x25, 0x15, 0x12, 0x00,
+ 0x00, 0x22, 0x55, 0x52, 0x65, 0x45, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00,
+ 0x20, 0x22, 0x10, 0x00, 0x00, 0x04, 0x72, 0x01, 0x72, 0x04, 0x00, 0x00,
+ 0x00, 0x21, 0x52, 0x44, 0x22, 0x01, 0x20, 0x00, 0x00, 0x22, 0x57, 0x57,
+ 0x75, 0x51, 0x56, 0x00, 0x00, 0x63, 0x15, 0x13, 0x15, 0x15, 0x67, 0x00,
+ 0x00, 0x73, 0x15, 0x75, 0x15, 0x15, 0x73, 0x00, 0x00, 0x67, 0x11, 0x17,
+ 0x51, 0x51, 0x61, 0x00, 0x00, 0x75, 0x25, 0x27, 0x25, 0x25, 0x75, 0x00,
+ 0x00, 0x56, 0x54, 0x34, 0x54, 0x55, 0x52, 0x00, 0x00, 0x51, 0x71, 0x51,
+ 0x51, 0x51, 0x57, 0x00, 0x00, 0x73, 0x55, 0x55, 0x55, 0x55, 0x75, 0x00,
+ 0x00, 0x73, 0x55, 0x55, 0x53, 0x71, 0x41, 0x00, 0x00, 0x63, 0x15, 0x23,
+ 0x45, 0x45, 0x35, 0x00, 0x00, 0x57, 0x52, 0x52, 0x52, 0x52, 0x72, 0x00,
+ 0x00, 0x55, 0x55, 0x55, 0x55, 0x72, 0x52, 0x00, 0x00, 0x55, 0x55, 0x52,
+ 0x22, 0x25, 0x25, 0x00, 0x00, 0x67, 0x24, 0x22, 0x21, 0x21, 0x67, 0x00,
+ 0x00, 0x31, 0x21, 0x22, 0x22, 0x24, 0x34, 0x00, 0x00, 0x02, 0x05, 0x00,
+ 0x00, 0x00, 0x70, 0x00, 0x00, 0x02, 0x34, 0x40, 0x70, 0x50, 0x70, 0x00,
+ 0x00, 0x01, 0x61, 0x13, 0x15, 0x15, 0x63, 0x00, 0x00, 0x04, 0x24, 0x56,
+ 0x75, 0x15, 0x66, 0x00, 0x00, 0x06, 0x61, 0x57, 0x51, 0x61, 0x41, 0x30,
+ 0x00, 0x21, 0x01, 0x33, 0x25, 0x25, 0x65, 0x00, 0x00, 0x14, 0x10, 0x54,
+ 0x34, 0x54, 0x54, 0x03, 0x00, 0x03, 0x52, 0x72, 0x52, 0x52, 0x56, 0x00,
+ 0x00, 0x00, 0x23, 0x55, 0x55, 0x55, 0x25, 0x00, 0x00, 0x00, 0x63, 0x55,
+ 0x55, 0x63, 0x41, 0x41, 0x00, 0x00, 0x66, 0x11, 0x21, 0x41, 0x31, 0x00,
+ 0x00, 0x02, 0x57, 0x52, 0x52, 0x52, 0x76, 0x00, 0x00, 0x00, 0x55, 0x55,
+ 0x55, 0x72, 0x52, 0x00, 0x00, 0x00, 0x55, 0x55, 0x52, 0x65, 0x45, 0x30,
+ 0x00, 0x60, 0x27, 0x14, 0x22, 0x21, 0x67, 0x00, 0x02, 0x32, 0x22, 0x42,
+ 0x22, 0x22, 0x32, 0x02, 0x00, 0x20, 0x2a, 0x25, 0x20, 0x20, 0x20, 0x00 };
diff --git a/src/col80_modified/icetmod_old.xbm b/src/col80_modified/icetmod_old.xbm
new file mode 100644
index 0000000..01fa394
--- /dev/null
+++ b/src/col80_modified/icetmod_old.xbm
@@ -0,0 +1,35 @@
+#define icetmod_width 8
+#define icetmod_height 384
+static unsigned char icetmod_bits[] = {
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x55, 0x75, 0x50,
+ 0x70, 0x50, 0x00, 0x00, 0x02, 0x16, 0x41, 0x22, 0x14, 0x43, 0x02, 0x00,
+ 0x00, 0x42, 0x25, 0x02, 0x05, 0x02, 0x04, 0x00, 0x00, 0x14, 0x22, 0x22,
+ 0x22, 0x22, 0x14, 0x00, 0x00, 0x25, 0x22, 0x77, 0x22, 0x25, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x02, 0x02, 0x01, 0x00, 0x40, 0x40, 0x20,
+ 0x20, 0x12, 0x12, 0x00, 0x00, 0x22, 0x35, 0x25, 0x25, 0x25, 0x72, 0x00,
+ 0x00, 0x32, 0x45, 0x34, 0x42, 0x41, 0x37, 0x00, 0x00, 0x75, 0x15, 0x35,
+ 0x46, 0x44, 0x34, 0x00, 0x00, 0x72, 0x41, 0x23, 0x25, 0x15, 0x12, 0x00,
+ 0x00, 0x22, 0x55, 0x52, 0x65, 0x45, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00,
+ 0x20, 0x22, 0x10, 0x00, 0x00, 0x04, 0x72, 0x01, 0x72, 0x04, 0x00, 0x00,
+ 0x00, 0x21, 0x52, 0x44, 0x22, 0x01, 0x20, 0x00, 0x00, 0x22, 0x57, 0x57,
+ 0x75, 0x51, 0x56, 0x00, 0x00, 0x63, 0x15, 0x13, 0x15, 0x15, 0x67, 0x00,
+ 0x00, 0x73, 0x15, 0x75, 0x15, 0x15, 0x73, 0x00, 0x00, 0x67, 0x11, 0x17,
+ 0x51, 0x51, 0x61, 0x00, 0x00, 0x75, 0x25, 0x27, 0x25, 0x25, 0x75, 0x00,
+ 0x00, 0x56, 0x54, 0x34, 0x54, 0x55, 0x52, 0x00, 0x00, 0x51, 0x71, 0x51,
+ 0x51, 0x51, 0x57, 0x00, 0x00, 0x74, 0x55, 0x57, 0x57, 0x55, 0x71, 0x00,
+ 0x00, 0x73, 0x55, 0x55, 0x53, 0x71, 0x41, 0x00, 0x00, 0x63, 0x15, 0x23,
+ 0x45, 0x45, 0x35, 0x00, 0x00, 0x57, 0x52, 0x52, 0x52, 0x52, 0x72, 0x00,
+ 0x00, 0x55, 0x55, 0x55, 0x55, 0x72, 0x52, 0x00, 0x00, 0x55, 0x55, 0x52,
+ 0x22, 0x25, 0x25, 0x00, 0x00, 0x67, 0x24, 0x22, 0x21, 0x21, 0x67, 0x00,
+ 0x00, 0x31, 0x21, 0x22, 0x22, 0x24, 0x34, 0x00, 0x00, 0x02, 0x05, 0x00,
+ 0x00, 0x00, 0x70, 0x00, 0x00, 0x02, 0x34, 0x40, 0x70, 0x50, 0x70, 0x00,
+ 0x00, 0x01, 0x61, 0x13, 0x15, 0x15, 0x63, 0x00, 0x00, 0x04, 0x24, 0x56,
+ 0x75, 0x15, 0x66, 0x00, 0x00, 0x06, 0x61, 0x57, 0x51, 0x61, 0x41, 0x30,
+ 0x00, 0x21, 0x01, 0x33, 0x25, 0x25, 0x65, 0x00, 0x00, 0x14, 0x10, 0x54,
+ 0x34, 0x54, 0x54, 0x03, 0x00, 0x03, 0x52, 0x72, 0x52, 0x52, 0x56, 0x00,
+ 0x00, 0x00, 0x23, 0x55, 0x55, 0x55, 0x25, 0x00, 0x00, 0x00, 0x63, 0x55,
+ 0x55, 0x63, 0x41, 0x41, 0x00, 0x00, 0x66, 0x11, 0x21, 0x41, 0x31, 0x00,
+ 0x00, 0x02, 0x57, 0x52, 0x52, 0x52, 0x76, 0x00, 0x00, 0x00, 0x55, 0x55,
+ 0x55, 0x72, 0x52, 0x00, 0x00, 0x00, 0x55, 0x55, 0x52, 0x65, 0x45, 0x30,
+ 0x00, 0x60, 0x27, 0x14, 0x22, 0x21, 0x67, 0x00, 0x02, 0x32, 0x22, 0x42,
+ 0x22, 0x22, 0x32, 0x02, 0x00, 0x20, 0x2a, 0x25, 0x20, 0x20, 0x20, 0x00 };
diff --git a/src/col80_modified/lsr.pl b/src/col80_modified/lsr.pl
new file mode 100644
index 0000000..915f769
--- /dev/null
+++ b/src/col80_modified/lsr.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+use bytes;
+
+$c = 0;
+
+while(<>) {
+ next unless @bytes = (/0x([0-9a-fA-F]{2})/g);
+ for(@bytes) {
+ if(!($c % 8)) {
+ print " .byte ";
+ }
+
+ printf "\$%02X", (reverse_bits(hex $_) >> 1);
+
+ if(($c % 8 == 7) || ($c == $#bytes)) {
+ print "\n";
+ $c = 0;
+ } else {
+ print ",";
+ $c++;
+ }
+ }
+}
+
+sub reverse_bits {
+ my $bitstr = reverse sprintf("%08b", $_[0]);
+ return eval "0b$bitstr";
+}
diff --git a/src/col80_modified/new_font.s b/src/col80_modified/new_font.s
new file mode 100644
index 0000000..f4fcfa4
--- /dev/null
+++ b/src/col80_modified/new_font.s
@@ -0,0 +1,48 @@
+ .byte $00,$04,$04,$04,$04,$00,$04,$00
+ .byte $00,$AA,$AE,$0A,$0E,$0A,$00,$00
+ .byte $40,$68,$82,$44,$28,$C2,$40,$00
+ .byte $40,$62,$84,$60,$80,$60,$40,$00
+ .byte $00,$28,$44,$44,$44,$44,$28,$00
+ .byte $00,$A4,$44,$EE,$44,$A4,$00,$00
+ .byte $00,$00,$00,$0E,$00,$40,$40,$80
+ .byte $00,$02,$02,$04,$04,$48,$48,$00
+ .byte $00,$44,$AC,$A4,$A4,$A4,$4E,$00
+ .byte $00,$4C,$A2,$2C,$42,$82,$EC,$00
+ .byte $00,$AE,$A8,$AC,$62,$22,$2C,$00
+ .byte $00,$4E,$82,$C4,$A4,$A8,$48,$00
+ .byte $00,$44,$AA,$4A,$A6,$A2,$44,$00
+ .byte $00,$00,$44,$00,$04,$44,$08,$00
+ .byte $00,$20,$4E,$80,$4E,$20,$00,$00
+ .byte $00,$84,$4A,$22,$44,$80,$04,$00
+ .byte $00,$44,$EA,$EA,$AE,$8A,$6A,$00
+ .byte $00,$C6,$A8,$C8,$A8,$A8,$E6,$00
+ .byte $00,$CE,$A8,$AE,$A8,$A8,$CE,$00
+ .byte $00,$E6,$88,$E8,$8A,$8A,$86,$00
+ .byte $00,$AE,$A4,$E4,$A4,$A4,$AE,$00
+ .byte $00,$6A,$2A,$2C,$2A,$AA,$4A,$00
+ .byte $00,$8A,$8E,$8A,$8A,$8A,$EA,$00
+ .byte $00,$CE,$AA,$AA,$AA,$AA,$AE,$00
+ .byte $00,$CE,$AA,$AA,$CA,$8E,$82,$00
+ .byte $00,$C6,$A8,$C4,$A2,$A2,$AC,$00
+ .byte $00,$EA,$4A,$4A,$4A,$4A,$4E,$00
+ .byte $00,$AA,$AA,$AA,$AA,$4E,$4A,$00
+ .byte $00,$AA,$AA,$4A,$44,$A4,$A4,$00
+ .byte $00,$E6,$24,$44,$84,$84,$E6,$00
+ .byte $00,$8C,$84,$44,$44,$24,$2C,$00
+ .byte $00,$40,$A0,$00,$00,$00,$0E,$00
+ .byte $00,$40,$2C,$02,$0E,$0A,$0E,$00
+ .byte $00,$80,$86,$C8,$A8,$A8,$C6,$00
+ .byte $00,$20,$24,$6A,$AE,$A8,$66,$00
+ .byte $00,$60,$86,$EA,$8A,$86,$82,$0C
+ .byte $00,$84,$80,$CC,$A4,$A4,$A6,$00
+ .byte $00,$28,$08,$2A,$2C,$2A,$2A,$C0
+ .byte $00,$C0,$4A,$4E,$4A,$4A,$6A,$00
+ .byte $00,$00,$C4,$AA,$AA,$AA,$A4,$00
+ .byte $00,$00,$C6,$AA,$AA,$C6,$82,$82
+ .byte $00,$00,$66,$88,$84,$82,$8C,$00
+ .byte $00,$40,$EA,$4A,$4A,$4A,$6E,$00
+ .byte $00,$00,$AA,$AA,$AA,$4E,$4A,$00
+ .byte $00,$00,$AA,$AA,$4A,$A6,$A2,$0C
+ .byte $00,$06,$E4,$28,$44,$84,$E6,$00
+ .byte $40,$4C,$44,$42,$44,$44,$4C,$40
+ .byte $00,$04,$54,$A4,$04,$04,$04,$00
diff --git a/src/col80_modified/t.dasm b/src/col80_modified/t.dasm
new file mode 100644
index 0000000..e32d950
--- /dev/null
+++ b/src/col80_modified/t.dasm
@@ -0,0 +1,3 @@
+ .processor 6502
+ .org 0
+ .include icetmod.s
diff --git a/src/col80_modified/test.atr b/src/col80_modified/test.atr
new file mode 100755
index 0000000..57b2d13
--- /dev/null
+++ b/src/col80_modified/test.atr
Binary files differ
diff --git a/src/col80_modified/xbm2font.pl b/src/col80_modified/xbm2font.pl
new file mode 100644
index 0000000..758d57e
--- /dev/null
+++ b/src/col80_modified/xbm2font.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+use bytes;
+
+$c = 0;
+
+while(<>) {
+ next unless @bytes = (/0x([0-9a-fA-F]{2})/g);
+ for(@bytes) {
+ if(!($c % 8)) {
+ print " .byte ";
+ }
+
+ printf "\$%02X", reverse_bits(hex $_);
+
+ if(($c % 8 == 7) || ($c == $#bytes)) {
+ print "\n";
+ $c = 0;
+ } else {
+ print ",";
+ $c++;
+ }
+ }
+}
+
+sub reverse_bits {
+ my $bitstr = reverse sprintf("%08b", $_[0]);
+ return eval "0b$bitstr";
+}
diff --git a/src/commands.c b/src/commands.c
new file mode 100644
index 0000000..001f384
--- /dev/null
+++ b/src/commands.c
@@ -0,0 +1,206 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <peekpoke.h>
+#include "fujichat.h"
+#include "features.h"
+#include "common.h"
+
+void cmd_join(void);
+void cmd_msg(void);
+void cmd_nick(void);
+void cmd_part(void);
+void cmd_ping(void);
+// void cmd_quit(void);
+void cmd_quote(void);
+void cmd_ver(void);
+void do_me(void);
+#ifdef FEAT_COLOR_COMMAND
+void cmd_fgcolor(void);
+void cmd_bgcolor(void);
+#endif
+
+fuji_cmd_t cmd_list[] = {
+ { "JOIN", ARGTYPE_OPT, cmd_join },
+ { "J", ARGTYPE_OPT, cmd_join },
+ { "MSG", ARGTYPE_REQUIRED, cmd_msg },
+ { "M", ARGTYPE_REQUIRED, cmd_msg },
+ { "NICK", ARGTYPE_REQUIRED, cmd_nick },
+ { "PART", ARGTYPE_NONE, cmd_part },
+ { "PING", ARGTYPE_REQUIRED, cmd_ping },
+ // { "QUIT", ARGTYPE_OPT, cmd_quit },
+ { "QUOTE", ARGTYPE_REQUIRED, cmd_quote },
+ { "VER", ARGTYPE_REQUIRED, cmd_ver },
+ { "VERSION", ARGTYPE_REQUIRED, cmd_ver },
+ { "ME", ARGTYPE_REQUIRED, do_me },
+#ifdef FEAT_COLOR_COMMAND
+ { "FGCOLOR", ARGTYPE_REQUIRED, cmd_fgcolor },
+ { "BGCOLOR", ARGTYPE_REQUIRED, cmd_bgcolor },
+#endif
+};
+
+#define CMD_LIST_SIZE (sizeof(cmd_list) / sizeof(fuji_cmd_t))
+
+char *cmd_arg;
+
+static void errmsg(char *msg) {
+ puts(msg);
+ bell();
+}
+
+static void err_missing_arg(void) {
+ errmsg("Command requires argument");
+}
+
+static void err_arg_not_allowed(void) {
+ errmsg("No argument allowed");
+}
+
+static void err_already_joined(void) {
+ errmsg("You are already in a channel (use /part to leave)");
+}
+
+
+void do_me(void) {
+ serv_msg_buf_len = sprintf(serv_msg_buf, "PRIVMSG %s :%cACTION %s%c%c",
+ channel, 1, cmd_arg, 1, NL);
+ send_serv_msg_buf();
+}
+
+void cmd_ver(void) {
+ serv_msg_buf_len = sprintf(serv_msg_buf, "PRIVMSG %s %cVERSION%c%c",
+ cmd_arg, 1, 1, NL);
+ send_serv_msg_buf();
+}
+
+void cmd_ping(void) {
+ serv_msg_buf_len = sprintf(serv_msg_buf, "PRIVMSG %s %cPING %03d %03d %03d%c%c",
+ cmd_arg, 1, PEEK(20), PEEK(19), PEEK(18), 1, NL);
+ send_serv_msg_buf();
+}
+
+void cmd_join(void) {
+ if(joined_channel) {
+ if(cmd_arg)
+ err_already_joined();
+ else
+ send_server_cmd("JOIN", channel);
+ } else {
+ if(cmd_arg) {
+ joined_channel = 1;
+ strcpy(channel, cmd_arg);
+ send_server_cmd("JOIN", cmd_arg);
+ } else {
+ err_missing_arg();
+ }
+ }
+}
+
+void cmd_part(void) {
+ joined_channel = 0;
+ send_server_cmd("PART", channel);
+}
+
+void cmd_msg(void) {
+ send_server_cmd("PRIVMSG", cmd_arg);
+}
+
+void cmd_quote(void) {
+ send_server_cmd(cmd_arg, NULL);
+}
+
+void cmd_nick(void) {
+ strcpy(config->nick, cmd_arg);
+ send_server_cmd("NICK", cmd_arg);
+ printf("> You are now known as %s\n", config->nick);
+}
+
+#ifdef FEAT_COLOR_COMMAND
+static void do_color(u16_t reg) {
+ u16_t c;
+
+ if(cmd_arg[0] >= '0' && cmd_arg[0] <= '9') {
+ c = atoi(cmd_arg);
+ if(c < 0x100) {
+ POKE(reg, c);
+ return;
+ }
+ }
+
+ puts("Bad color (range 0-255)");
+ bell();
+}
+
+void cmd_fgcolor(void) {
+ do_color(709);
+}
+
+void cmd_bgcolor(void) {
+ do_color(710);
+}
+
+#endif
+
+void handle_command(void) {
+ char i, *cend;
+ char *cmd = input_buf + 1;
+ char *p = cmd;
+
+ cmd_arg = NULL;
+
+ /* convert command word to uppercase */
+ while((*p != NL) && (*p != ' ')) {
+ *p = toupper(*p);
+ ++p;
+ }
+
+ cend = p;
+
+ /* set cmd_arg pointer, nul-terminate cmd_arg, if present */
+ /* (otherwise, cmd_arg remains NULL) */
+ if(*p != NL) {
+ cmd_arg = p;
+ /* skip extra whitespace */
+ while(*cmd_arg == ' ')
+ ++cmd_arg;
+ p = cmd_arg + 1;
+ while(*p && (*p != NL))
+ ++p;
+ *p = '\0';
+ }
+
+ /* nul-terminate cmd */
+ *cend = '\0';
+
+ for(i=0; i<CMD_LIST_SIZE; ++i) {
+ if(strcmp(cmd, cmd_list[i].cmd) != 0)
+ continue;
+
+ switch(cmd_list[i].arg_type) {
+ case ARGTYPE_REQUIRED:
+ if(!cmd_arg) {
+ err_missing_arg();
+ return;
+ }
+ break;
+
+ case ARGTYPE_NONE:
+ if(cmd_arg) {
+ err_arg_not_allowed();
+ return;
+ }
+ return;
+
+ default:
+ break;
+ }
+
+ (cmd_list[i].handler)();
+ return;
+ }
+
+ /* no idea what this is, send it as-is */
+ send_server_cmd(cmd, cmd_arg);
+}
diff --git a/src/common.c b/src/common.c
new file mode 100644
index 0000000..0a28871
--- /dev/null
+++ b/src/common.c
@@ -0,0 +1,255 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <rs232.h>
+#include "uip.h"
+#include "common.h"
+#include "aexec.h"
+#include "fujichat.h"
+
+int __fastcall__ (*atari_exec_p)(char *) = (int __fastcall__ (*)(char *))0x600;
+fuji_conf_t *config = (fuji_conf_t *)CONFIG_ADDRESS;
+
+void disable_break(void) {
+ asm("lda $10"); /* POKMSK */
+ asm("and #$7f");
+ asm("sta $10"); /* POKMSK */
+ asm("sta $D20E"); /* IRQEN */
+}
+
+/* easier to copy/paste this tiny function from uip.c
+ than it would be to rebuild all of uIP for use in
+ this program! Also don't want to bloat fujiconf by
+ linking uip.a, even if it would link without a
+ recompile. */
+/*
+u16_t local_htons(u16_t val) {
+ return HTONS(val);
+}
+*/
+
+/* this version's half the size */
+u16_t local_htons(u16_t val) {
+ __AX__ = val;
+ asm("sta tmp1");
+ asm("txa");
+ asm("ldx tmp1");
+}
+
+/* helper for fuji_cgetc */
+void __fastcall__ call_keybdv(void) {
+ asm("lda $E420+5"); /* KEYBDV */
+ asm("pha");
+ asm("lda $E420+4");
+ asm("pha");
+ asm("lda #12");
+ asm("sta $2A"); /* ICAX1Z */
+}
+
+/* replacement for cgetc() that doesn't include cursor enable/disable
+ stuff (otherwise copied from cc65's cgetc.s) */
+char __fastcall__ fuji_cgetc(void) {
+ asm("jsr _call_keybdv");
+ asm("ldx #0");
+}
+
+
+#if 0
+char get_config(void) {
+ char config_valid = 0;
+ FILE *f = fopen(DEFAULT_CONF_FILE, "rb");
+
+ puts("Loading config from " DEFAULT_CONF_FILE);
+
+ if(f) {
+ config_valid =
+ fread(config, 1, sizeof(fuji_conf_t), f) == sizeof(fuji_conf_t);
+ fclose(f);
+ if(!config_valid)
+ puts("Config file is wrong size");
+ } else {
+ puts("No config file found");
+ }
+
+ if(config_valid) {
+ if(!config_is_valid()) {
+ puts("Invalid or outdated config file");
+ config_valid = 0;
+ } else {
+ puts("Loaded OK");
+ }
+ }
+
+ return config_valid;
+}
+
+#else
+/* using open() read() close() instead of fopen() fread() fclose()
+ is a big win: save us 438 bytes! */
+char get_config(void) {
+ char config_valid = 0;
+ int f = open(DEFAULT_CONF_FILE, O_RDONLY);
+
+ puts("Loading config from " DEFAULT_CONF_FILE);
+
+ if(f >= 0) {
+ config_valid =
+ (read(f, config, sizeof(fuji_conf_t)) == sizeof(fuji_conf_t));
+ close(f);
+ if(!config_valid)
+ puts("Config file is wrong size");
+ } else {
+ puts("No config file found");
+ }
+
+ if(config_valid) {
+ if(!config_is_valid()) {
+ puts("Invalid or outdated config file");
+ config_valid = 0;
+ } else {
+ puts("Loaded OK");
+ }
+ }
+
+ return config_valid;
+}
+#endif
+
+char config_is_valid(void) {
+ // return( (memcmp(config->signature, CONF_SIGNATURE, 2) == 0) && (config->version == CONF_VERSION) );
+ return
+ *((char *)CONFIG_ADDRESS) == CONF_SIGNATURE_LO &&
+ *(char *)(CONFIG_ADDRESS+1) == CONF_SIGNATURE_HI &&
+ *(char *)(CONFIG_ADDRESS+2) == CONF_VERSION;
+}
+
+void set_default_config(void) {
+ puts("Using built-in defaults");
+ /*
+ // FIXME: why does this end up always 0.0.0.0 now?
+ // has something to do with macro expansion. What a mess.
+ uip_ipaddr(&(config->local_ip), 192,168,0,2);
+ uip_ipaddr(&(config->peer_ip), 192,168,0,1);
+ uip_ipaddr(&(config->resolver_ip), 192,168,0,1);
+ */
+
+ config->local_ip[0] = 0xa8c0;
+ config->local_ip[1] = 0x0200;
+
+ config->peer_ip[0] = 0xa8c0;
+ config->peer_ip[1] = 0x0100;
+
+ config->resolver_ip[0] = 0xa8c0;
+ config->resolver_ip[1] = 0x0100;
+
+ strcpy(config->server, "na.newnet.net");
+ strcpy(config->nick, DEFAULT_NICK);
+ strcpy(config->real_name, "FujiChat User");
+ config->server_port = 6667;
+ config->ui_flags = UIFLAG_HIDEMOTD;
+ config->bg_color = 0xc0; /* dark green */
+ config->fg_color = 0x0c;
+ config->baud = RS_BAUD_4800;
+
+ *(char *)(CONFIG_ADDRESS) = CONF_SIGNATURE_LO;
+ *(char *)(CONFIG_ADDRESS+1) = CONF_SIGNATURE_HI;
+ *(char *)(CONFIG_ADDRESS+2) = CONF_VERSION;
+
+ // config_valid = 1;
+}
+
+static char ipbuf[20];
+/*
+static char *fmt = "%d.%d.%d.%d";
+*/
+char * format_ip(uip_ipaddr_t *ip) {
+
+ u16_t *ipaddr = (u16_t *)ip;
+ sprintf(ipbuf, "%d.%d.%d.%d",
+ local_htons(ipaddr[0]) >> 8,
+ local_htons(ipaddr[0]) & 0xff,
+ local_htons(ipaddr[1]) >> 8,
+ local_htons(ipaddr[1]) & 0xff);
+
+ return ipbuf;
+
+ /*
+ asm(" sta ptr1");
+ asm(" stx ptr1+1");
+
+ asm(" lda #<_ipbuf");
+ asm(" ldx #>_ipbuf");
+ asm(" jsr pushax");
+
+ asm(" lda #<_fmt");
+ asm(" ldx #>_fmt");
+ asm(" jsr pushax");
+
+ asm(" ldy #0");
+ asm(" lda (ptr1),y");
+ asm(" jsr pusha0");
+
+ asm(" ldy #1");
+ asm(" lda (ptr1),y");
+ asm(" jsr pusha0");
+
+ asm(" ldy #2");
+ asm(" lda (ptr1),y");
+ asm(" jsr pusha0");
+
+ asm(" ldy #3");
+ asm(" lda (ptr1),y");
+ asm(" jsr pusha0");
+
+ asm(" ldy #$0c");
+ asm(" jsr _sprintf");
+
+ asm(" lda #<_ipbuf");
+ asm(" ldx #>_ipbuf");
+ */
+}
+
+void get_line(char *buf, unsigned char len) {
+ asm("ldy #$00");
+ asm("lda (sp),y");
+ asm("sta $e2");
+
+ asm("ldy #$02");
+ asm("jsr ldaxysp");
+ asm("sta $e0");
+ asm("stx $e0+1");
+
+ asm("@loop: lda _stdin");
+ asm("ldx _stdin+1");
+ asm("jsr _fgetc");
+
+ asm("cmp #$9B");
+ asm("beq @out");
+
+ asm("ldy #$00");
+ asm("sta ($e0),y");
+ asm("inc $e0");
+ asm("bne @noinc");
+ asm("inc $e0+1");
+ asm("@noinc:");
+
+ asm("dec $e2");
+ asm("bne @loop");
+
+ asm("@out:");
+ asm("ldy #$00");
+ asm("tya");
+ asm("sta ($e0),y");
+
+ /*
+ // C implementation is 80 bytes, asm is 50
+ fgets(buf, len, stdin);
+ while(*buf) {
+ if(*buf == '\n')
+ *buf = '\0';
+ ++buf;
+ }
+ */
+}
+
diff --git a/src/common.h b/src/common.h
new file mode 100644
index 0000000..c84b417
--- /dev/null
+++ b/src/common.h
@@ -0,0 +1,27 @@
+#ifndef COMMON_H
+#define COMMON_H
+
+#include "fujichat.h"
+
+/* common functions, shared by fujichat.c and fujiconf.c.
+ Don't put anything here unless it really is shared! */
+
+/* This stays resident */
+extern fuji_conf_t *config;
+
+/* uIP-related */
+char * format_ip(uip_ipaddr_t *ip);
+u16_t local_htons(u16_t val);
+
+/* config-related */
+char get_config(void);
+char config_is_valid(void);
+void set_default_config(void);
+
+/* UI-related */
+char __fastcall__ fuji_cgetc(void);
+void __fastcall__ fuji_putchar(char); /* fujiput.s */
+void get_line(char *buf, unsigned char len);
+void disable_break(void);
+
+#endif
diff --git a/src/dns.c b/src/dns.c
new file mode 100644
index 0000000..f5eef0f
--- /dev/null
+++ b/src/dns.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <atari.h>
+#include "uip.h"
+#include "uiplib.h"
+#include "rs232dev.h"
+#include <conio.h>
+#include <peekpoke.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "telnet.h"
+#include "resolv.h"
+#include "timer.h"
+
+#ifndef NULL
+#define NULL (void *)0
+#endif /* NULL */
+
+char buf[256];
+
+int main(void) {
+ char c;
+ int i;
+ uip_ipaddr_t ipaddr;
+ struct timer periodic_timer;
+
+ timer_set(&periodic_timer, CLOCK_SECOND / 2);
+
+ rs232dev_init();
+ uip_init();
+
+ uip_ipaddr(ipaddr, 192,168,0,2);
+ uip_sethostaddr(ipaddr);
+ uip_ipaddr(ipaddr, 192,168,0,1);
+ uip_setdraddr(ipaddr);
+ uip_ipaddr(ipaddr, 255,255,255,0);
+ uip_setnetmask(ipaddr);
+
+ resolv_init();
+ uip_ipaddr(ipaddr, 192,168,88,1);
+ resolv_conf(ipaddr);
+
+ cursor(1);
+
+ while(1) {
+ puts("DNS test. Hostname:");
+ fgets(buf, 256, stdin);
+ for(i=0; i<strlen(buf); ++i)
+ if(buf[i] == '\n') buf[i] = '\0';
+ printf("Trying to resolve host %s, press any key to stop\n", buf);
+ resolv_query(buf);
+
+ while(1) {
+ /* This part of the while loop is straight from the no-ARP example
+ code, from the uIP docs. */
+ uip_len = rs232dev_poll();
+ if(uip_len > 0) {
+ uip_input();
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ } else if(timer_expired(&periodic_timer)) {
+ timer_reset(&periodic_timer);
+ for(i = 0; i < UIP_CONNS; i++) {
+ uip_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+
+#if UIP_UDP
+ for(i = 0; i < UIP_UDP_CONNS; i++) {
+ uip_udp_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+#endif /* UIP_UDP */
+ }
+
+ if(kbhit()) {
+ cgetc();
+ break;
+ }
+ }
+ }
+}
+
+void telnet_connected(struct telnet_state *s) {
+}
+
+void telnet_closed(struct telnet_state *s) {
+}
+
+void telnet_sent(struct telnet_state *s) {
+}
+
+void telnet_aborted(struct telnet_state *s) {
+}
+
+void telnet_timedout(struct telnet_state *s) {
+}
+
+void telnet_newdata(struct telnet_state *s, char *data, u16_t len) {
+}
+
+void resolv_found(char *name, u16_t *ipaddr) {
+ if(ipaddr == NULL) {
+ printf("Host '%s' not found.\n", name);
+ } else {
+ printf("Found name '%s' = %d.%d.%d.%d\n", name,
+ htons(ipaddr[0]) >> 8,
+ htons(ipaddr[0]) & 0xff,
+ htons(ipaddr[1]) >> 8,
+ htons(ipaddr[1]) & 0xff);
+ puts("Press any key...");
+ // webclient_get("www.google.com", 80, "/index.html");
+ // webclient_get(name, 80, "/~adam/uip");
+ }
+}
diff --git a/src/dos25_4drives.atr b/src/dos25_4drives.atr
new file mode 100644
index 0000000..a032ec9
--- /dev/null
+++ b/src/dos25_4drives.atr
Binary files differ
diff --git a/src/dos_20s.atr b/src/dos_20s.atr
new file mode 100644
index 0000000..8016b73
--- /dev/null
+++ b/src/dos_20s.atr
Binary files differ
diff --git a/src/env.sh b/src/env.sh
new file mode 100644
index 0000000..0d1e50e
--- /dev/null
+++ b/src/env.sh
@@ -0,0 +1,10 @@
+# source this file to set up your environment for a snapshot of cc65
+# installed in a nonstandard place.
+
+CC65_PREFIX=/home/urchlay/cc65_snap
+
+PATH=$CC65_PREFIX/bin:$PATH
+CC65_INC=$CC65_PREFIX/lib/cc65/include
+CC65_LIB=$CC65_PREFIX/lib/cc65/lib
+
+export PATH CC65_INC CC65_LIB
diff --git a/src/equates.inc b/src/equates.inc
new file mode 100644
index 0000000..9759a8a
--- /dev/null
+++ b/src/equates.inc
@@ -0,0 +1,1386 @@
+;
+; ATARI 800 EQUATE LISTING
+;
+; (version 20070530_bkw)
+;
+; This is a heavily modified copy of Appendix A of the Atari System
+; Reference Manual (with much info added from Appendix B, and from
+; Mapping the Atari and other sources)
+;
+;
+;This listing is based on the original release of Operating System,
+;version A. The vectors shown here were not changed in version B.
+;New equates for XL and XE models are included and noted. Changes
+;from version B to XL/XE are also noted.
+;
+;Most of the equate names given below are the official Atari
+;names. They are in common use but are not mandatory.
+
+; This file can be included in your assembly source, but it's also
+; got a lot of useful human-readable comments. It's meant to serve as
+; a "quick reference" to Atari programmers, particularly ones who use
+; a cross-assembler on a UNIX-ish platform and a text editor that can
+; use "ctags":
+
+; $ ctags equates.inc
+; $ vim mystuff.dasm
+
+; While in vim, press ^] (control-right-bracket) while sitting on a label,
+; to jump to that label's definition in this file. (Also, you can type
+; :tag labelname). You can also do completion on the labels in vim by
+; typing part of a label and pressing ^N (or Tab, if you use the
+; CleverTab script from vimhelp.org)
+
+; GNU Emacs and XEmacs also support ctags, but I've never used them, so
+; I dunno how to do it. I do know that you need to use "Exuberant" ctags,
+; not the ctags that comes with emacs (which doesn't grok 6502 asm).
+
+; If you're using an Atari assembler instead of a cross-assembler, you
+; don't want to use this as-is: all the extra comments make it huge, and
+; it'll be either too large for the Atari's memory, or at least will take
+; a long time to assemble. You can make a comment-less, Atari-compatible
+; version like so:
+
+; perl -lne 's/;.*//; s/\s*$//; print if $_' < equates.inc > small.inc
+
+; ...then use a8eol to convert it to ATASCII format.
+
+; 20061028 bkw: Originally downloaded from:
+
+; http://atrey.karlin.mff.cuni.cz/~pavel/atari/atrb.html
+
+; ...and converted to DASM/ATASM/CA65 format. dasm, atasm, and ca65 use
+; similar enough syntax that this file can be used as-is with any of
+; them. Unfortunately, this means I can't do conditional assembly in this
+; file, since the two assemblers use different semantics... macros are
+; even less compatible :(
+
+; If you use ca65, you need this line in your source:
+
+;; .FEATURE labels_without_colons
+
+; before including this file, or else run ca65 with
+; "--feature labels_without_colons").
+
+; 20070529 bkw: updated, added missing GTIA/POKEY/ANTIC equates,
+; documented where the shadows are for those GTIA/POKEY/ANTIC/PIA
+; registers that have them. Also added a list of error messages and
+; explanation of the cassette buffer layout, and organized the C_*
+; CIO constants. Made minor modifications to get this file to assemble
+; with ATasm as well as DASM.
+
+; I have added a few missing equates: this file only
+; contained OS ROM locations when I got it.
+; I added a few from FMS/DOS as well (e.g. RUNAD and INITAD).
+
+; XL-specific locations in the original file were duplicate labels
+; (e.g. PTIMOT was defined as both $1C and $314), which keeps DASM
+; from being able to assemble the file. I prefixed the XL/XL versions
+; with "XL_"
+
+; Also, I've prefixed the CIO command and AUX1 constants with C_, since some
+; of them conflicted with other labels in the original version.
+
+; Areas listed as "unmapped" are literally not connected to anything.
+; Trying to read from unmapped address space results in reading whatever
+; garbage was on the data bus when the read happened. On my 1200XL, this
+; generally results in all 1's ($FF or 255).
+; In a 400, 600XL or other Atari with less than 48K of RAM, the missing
+; RAM address space is also unmapped.
+
+; Still TODO:
+; - Rest of the DOS/FMS equates
+; - Mark 800-ony locations with OSB_
+; - ifdef code, so the user can set the machine type (OSB or XL),
+; then refer to e.g. PTIMOT and get either OSB_PTIMOT or XL_PTIMOT
+; - Split into separate files? I'd rather not (it's only about 1000 lines)
+
+; This file's mostly intended for new development. It could also be
+; useful for porting old ASM/ED or Mac65 code to DASM, but such code
+; may need work... you can always assemble it with ATasm, in that case,
+; since it's 99.999% source code compatible with Mac65.
+
+; References to "APPENDIX C" and such are referring to the Atari System
+; Reference Manual, a version of which can be found at:
+
+; http://atrey.karlin.mff.cuni.cz/~pavel/atari/atrtblc.html
+
+; References to "Mapping" refer to "Mapping the Atari, Revised Edition",
+; which can be found at:
+
+; http://www.atariarchives.org/mapping/index.php
+
+; I've pasted a few quotes from Mapping into this file; I consider them
+; small enough to be covered under the "fair use" provisions of copyright law
+; (I am not a lawyer, though).
+
+;
+;
+; DEVICE NAMES
+;
+;
+;SCREDT = "E" SCREEN EDITOR
+;KBD = "K" KEYBOARD
+;DISPLY = "S" DISPLAY
+;PRINTR = "P" PRINTER
+;CASSET = "C" CASSETTE
+;DISK = "D" DISK DRIVE
+;
+;
+;
+; STATUS CODES
+;
+;
+
+; 20070529 bkw: These are returned as error codes, though various DOSes
+; also define their own codes (usually in the range 160-255).
+; Errors 2-21 are defined by BASIC.
+; Errors 150-154 are defined by the R: (850 or compatible, RS-232) handler.
+SUCCES = $01 ; 1
+BRKABT = $80 ; 128 BREAK KEY ABORT
+PRVOPN = $82 ; 130 IOCB ALREADY OPEN
+NONDEV = $82 ; 130 NONEXISTANT DEVICE
+WRONLY = $83 ; 131 OPENED FOR WRITE ONLY
+NVALID = $84 ; 132 INVALID COMMAND
+NOTOPN = $85 ; 133 DEVICE OR FILE NOT OPEN
+BADIOC = $86 ; 134 INVALID IOCB NUMBER
+RDONLY = $87 ; 135 OPENED FOR READ ONLY
+EOFERR = $88 ; 136 END OF FILE
+TRNRCD = $89 ; 137 TRUNCATED RECORD
+TIMOUT = $8A ; 138 PERIPHERAL TIME OUT
+DNACK = $8B ; 139 DEVICE DOES NOT ACKNOWLEDGE
+FRMERR = $8C ; 140 SERIAL BUS FRAMING ERROR
+CRSROR = $8D ; 141 CURSOR OUT OF RANGE
+OVRRUN = $8E ; 142 SERIAL BUS DATA OVERRUN
+CHKERR = $8F ; 143 SERIAL BUS CHECKSUM ERROR
+DERROR = $90 ; 144 PERIPHERAL DEVICE ERROR
+BADMOD = $91 ; 145 NON EXISTANT SCREEN MODE
+FNCNOT = $92 ; 146 FUNCTION NOT IMPLEMENTED
+SCRMEM = $93 ; 147 NOT ENOUGH MEMORY FOR SCREEN MODE
+
+; BASIC error codes (also used by e.g. Basic XL/XE and Turbo BASIC):
+;; 2: Insufficient Memory
+;; 3: Value Error
+;; 4: Too Many Variables
+;; 5: String Length Error
+;; 6: Out of Data Error
+;; 7: Number Greater than 32767
+;; 8: Input Statement Error
+;; 9: Array or String DIM Error
+;; 10: Argument Stack Overflow
+;; 11: Floating Point Overflow or Underflow Error
+;; 12: Line Not Found
+;; 13: No Matching FOR Statement
+;; 14: Line Too Long
+;; 15: GOSUB or FOR Line Deleted
+;; 16: RETURN Error
+;; 17: Garbage Error
+;; 18: Invalid String Character
+;; 19: LOAD Program Too Long
+;; 20: Bad Channel Number
+;; 21: LOAD File Error
+
+; 850/R: error codes:
+;; 150: Serial Port Already Open
+;; 151: Concurrent Mode Not Enabled
+;; 152: Illegal User-Supplied Buffer
+;; 153: Active Concurrent Mode Error
+;; 154: Concurrent Mode Not Active
+
+; DOS error codes (DOS 2.0S only; other DOSes may define other errors)
+;; 160: Device Number Error
+;; 161: Too Many OPEN Files
+;; 162: Disk Full
+;; 163: Fatal System Error
+;; 164: File Number Mismatch
+;; 165: Bad File Name
+;; 166: POINT Data Length Error
+;; 167: File Locked
+;; 168: Invalid XIO Command
+;; 169: Directory Full
+;; 170: File Not Found
+;; 171: POINT Invalid
+;; 172: DOS 1 File
+;; 173: Bad Sector
+;; 255: FORMATTING Error (DOS 2.5)
+
+;
+;
+;
+;
+; COMMAND CODES FOR CIO
+;
+;
+
+; Command byte goes in ICCOM,x
+
+;; General-purpose commands:
+C_OPEN = $03 ; 3 OPEN (BASIC OPEN)
+C_GETREC = $05 ; 5 GET RECORD
+C_GETCHR = $07 ; 7 GET BYTE
+C_PUTREC = $09 ; 9 WRITE RECORD
+C_PUTCHR = $0B ; 11 PUT-BYTE
+C_CLOSE = $0C ; 12
+C_STATUS = $0D ; 13
+C_SPECIL = $0E ; 14 BEGINNING OF SPECIAL COMMANDS (aka XIO)
+;; Commands for S: device:
+C_DRAWLN = $11 ; 17 SCREEN DRAW (BASIC DRAWTO)
+C_FILLIN = $12 ; 18 SCREEN FILL
+;; Commands for D: device (only when DOS is loaded):
+C_RENAME = $20 ; 32
+C_DELETE = $21 ; 33
+C_LOCK = $23 ; 35
+C_UNLOCK = $24 ; 36
+C_POINT = $25 ; 37
+C_NOTE = $26 ; 38
+
+; AUX1 modes (ICAX1,x or 2nd parameter of BASIC OPEN command):
+C_OPREAD = $04 ; 4 OPEN FOR INPUT
+C_OWRITE = $08 ; 8 OPEN FOR OUTPUT
+C_APPEND = $09 ; 9 OPEN TO APPEND TO END OF DISK FILE
+C_OUPDAT = $0C ; 12 OPEN FOR INPUT AND OUTPUT AT THE SAME TIME
+;; D: (DOS) only:
+C_OPDIR = $06 ; 6 OPEN TO DISK DIRECTORY
+;; S: only:
+C_MXDMOD = $10 ; 16 OPEN TO SPLIT SCREEN (MIXED MODE)
+C_INSCLR = $20 ; 32 OPEN TO SCREEN BUT DON'T ERASE
+;; C: only:
+C_NOIRG = $80 ; 128 NO GAP CASSETTE MODE
+
+;; Command bytes (ICCOM) for the RS-232 (R:) device:
+;;
+;; Output partial block 32 $20
+;; Control RTS,XMT,DTR 34 $22
+;; Baud, stop bits, word size 36 $24
+;; Translation mode 38 $26
+;; Concurrent mode 40 $28
+;;
+;; (see the 850 Interface Manual for details)
+
+
+; SIO command bytes (not part of CIO):
+S_DFRMAT = $21 ; 33 FORMAT DISK (RESIDENT DISK HANDLER (RDH))
+S_PTSECT = $50 ; 80 RDH PUT SECTOR
+S_GTSECT = $52 ; 82 RDH GET SECTOR
+S_DSTAT = $53 ; 83 RDH GET STATUS
+S_PSECTV = $57 ; 87 RDH PUT SECTOR AND VERIFY
+; Various other SIO commands are supported by different drives
+
+; 20061028 bkw: CR/EOL not really part of CIO, but useful:
+CR = $9B ; 155 CARRIAGE RETURN (EOL)
+EOL = CR ; defined in SYSEQU.ASM
+
+;
+IOCBSZ = $10 ; 16 IOCB SIZE
+MAXIOC = $80 ; 128 MAX IOCB BLOCK SIZE
+IOCBF = $FF ; 255 IOCB FREE
+;
+LEDGE = $02 ; 2 DEFAULT LEFT MARGIN
+REDGE = $27 ; 39 DEFAULT RIGHT MARGIN
+
+; OS VARIABLES
+;
+; PAGE 0
+;
+LINZBS = $00 ; 0 (800) FOR ORIGINAL DEBUGGER
+; $00 0 (XL) RESERVED
+NGFLAG = $01 ; 1 (XL) FOR POWER-UP SELF TEST
+CASINI = $02 ; 2
+RAMLO = $04 ; 4 POINTER FOR SELF TEST
+TRAMSZ = $06 ; 6 TEMPORARY RAM SIZE
+TSTDAT = $07 ; 7 TEST DATA
+WARMST = $08 ; 8
+BOOTQ = $09 ; 9 SUCCESSFUL BOOT FLAG
+; aka BOOT? in the OS source, but some assemblers don't support ? in labels
+DOSVEC = $0A ; 10 PROGRAM RUN VECTOR
+DOSINI = $0C ; 12 PROGRAM INITIALIZATION
+APPMHI = $0E ; 14 DISPLAY LOW LIMIT
+POKMSK = $10 ; 16 IRQ ENABLE FLAGS (shadow for IRQEN)
+BRKKEY = $11 ; 17 FLAG
+RTCLOK = $12 ; 18 3 BYTES, MSB FIRST
+BUFADR = $15 ; 21 INDIRECT BUFFER ADDRESS
+ICCOMT = $17 ; 23 COMMAND FOR VECTOR
+DSKFMS = $18 ; 24 DISK FILE MANAGER POINTER
+DSKUTL = $1A ; 26 DISK UTILITY POINTER (DUP.SYS)
+PTIMOT = $1C ; 28 (800) PRINTER TIME OUT REGISTER
+ABUFPT = $1C ; 28 (XL) RESERVED
+PBPNT = $1D ; 29 (800) PRINTER BUFFER POINTER
+; $1D ; 29 (XL) RESERVED
+PBUFSZ = $1E ; 30 (800) PRINTER BUFFER SIZE
+; $1E ; 30 (XL) RESERVED
+PTEMP = $1F ; 31 (800) TEMPORARY REGISTER (PTEMP deleted in XL OS)
+; $1F ; 31 (XL) RESERVED
+ZIOCB = $20 ; 32 ZERO PAGE IOCB
+ICHIDZ = $20 ; 32 HANDLER INDEX NUMBER (ID)
+ICDNOZ = $21 ; 33 DEVICE NUMBER
+ICCOMZ = $22 ; 34 COMMAND
+ICSTAZ = $23 ; 35 STATUS
+ICBALZ = $24 ; 36 BUFFER POINTER LOW BYTE
+ICBAHZ = $25 ; 37 BUFFER POINTER HIGH BYTE
+ICPTLZ = $26 ; 38 PUT ROUTINE POINTER LOW
+ICPTHZ = $27 ; 39 PUT ROUTINE POINTER HIGH
+ICBLLZ = $28 ; 40 BUFFER LENGTH LOW
+ICBLHZ = $29 ; 41
+ICAX1Z = $2A ; 42 AUXILIARY INFORMATION BYTE 1
+ICAX2Z = $2B ; 43
+ICSPRZ = $2C ; 44 TWO SPARE BYTES (CIO USE)
+ICIDNO = $2E ; 46 IOCB NUMBER X 16
+CIOCHR = $2F ; 47 CHARACTER BYTE FOR CURRENT OPERATION
+;
+STATUS = $30 ; 48 STATUS STORAGE
+CHKSUM = $31 ; 49 SUM WITH CARRY ADDED BACK
+BUFRLO = $32 ; 50 DATA BUFFER LOW BYTE
+BUFRHI = $33 ; 51
+BFENLO = $34 ; 52 ADDRESS OF LAST BUFFER BYTE +1 (LOW)
+BFENHI = $35 ; 53
+CRETRY = $36 ; 54 (800) NUMBER OF COMMAND FRAME RETRIES
+XL_LTEMP = $36 ; 54 (XL) LOADER TEMPORARY STORAGE, 2 BYTES
+DRETRY = $37 ; 55 (800) DEVICE RETRIES
+BUFRFL = $38 ; 56 BUFFER FULL FLAG
+RECVDN = $39 ; 57 RECEIVE DONE FLAG
+XMTDON = $3A ; 58 TRANSMISSION DONE FLAG
+CHKSNT = $3B ; 59 CHECKSUM-SENT FLAG
+NOCKSM = $3C ; 60 CHECKSUM-DOES-NOT-FOLLOW-DATA FLAG
+BPTR = $3D ; 61
+FTYPE = $3E ; 62
+FEOF = $3F ; 63
+FREQ = $40 ; 64
+;
+SOUNDR = $41 ; 65 0=QUIET I/O
+CRITIC = $42 ; 66 CRITICAL FUNCTION FLAG, NO DEFFERED VBI
+FMSZPG = $43 ; 67 DOS ZERO PAGE, 7 BYTES
+CKEY = $4A ; 74 (800) START KEY FLAG
+XL_ZCHAIN = $4A ; 74 (XL) HANDLER LOADER TEMP, 2 BYTES
+CASSBT = $4B ; 75 (800) CASSETTE BOOT FLAG
+DSTAT = $4C ; 76 DISPLAY STATUS
+;
+ATRACT = $4D ; 77
+DRKMSK = $4E ; 78 ATTRACT MASK
+COLRSH = $4F ; 79 ATTRACT COLOR SHIFTER (EORed WITH GRAPHICS)
+;
+TMPCHR = $50 ; 80
+HOLD1 = $51 ; 81
+LMARGN = $52 ; 82 SCREEN LEFT MARGIN REGISTER
+RMARGN = $53 ; 83 SCREEN RIGHT MARGIN
+ROWCRS = $54 ; 84 CURSOR ROW
+COLCRS = $55 ; 85 CURSOR COLUMN, 2 BYTES
+DINDEX = $57 ; 87 DISPLAY MODE
+SAVMSC = $58 ; 88 SCREEN ADDRESS
+OLDROW = $5A ; 90 CURSOR BEFORE DRAW OR FILL
+OLDCOL = $5B ; 91
+OLDCHR = $5D ; 93 DATA UNDER CURSOR
+OLDADR = $5E ; 94 CURSOR ADDRESS
+XL_FKDEF = $60 ; 96 (XL) FUNCTION KEY DEFINITION POINTER (LSB/MSB)
+NEWROW = $60 ; 96 (800) DRAWTO DESTINATION
+NEWCOL = $61 ; 97 (800) DRAWTO DESTINATION, 2 BYTES
+XL_PALNTS = $62 ; 98 (XL) EUROPE/NORTH AMERICA TV FLAG
+LOGCOL = $63 ; 99 LOGICAL LINE COLUMN POINTER
+MLTTMP = $66 ; 102
+OPNTMP = $66 ; 102 TEMPORARY STORAGE FOR CHANNEL OPEN
+SAVADR = $68 ; 104
+RAMTOP = $6A ; 106 START OF ROM (END OF RAM + 1), HIGH BYTE ONLY
+BUFCNT = $6B ; 107 BUFFER COUNT
+BUFSTR = $6C ; 108 POINTER USED BY EDITOR
+BITMSK = $6E ; 110 POINTER USED BY EDITOR
+SHFAMT = $6F ; 111
+ROWAC = $70 ; 112
+COLAC = $72 ; 114
+ENDPT = $74 ; 116
+DELTAR = $76 ; 118
+DELTAC = $77 ; 119
+ROWINC = $79 ; 121 (800)
+XL_KEYDEF = $79 ; 121 (XL) KEY DEFINITION POINTER, 2 BYTES
+COLINC = $7A ; 122 (800)
+SWPFLG = $7B ; 123 NON 0 IF TEXT AND REGULAR RAM IS SWAPPED
+HOLDCH = $7C ; 124 CH MOVED HERE BEFORE CTRL AND SHIFT
+INSDAT = $7D ; 125 used by S: handler, tmp for char under cursor
+COUNTR = $7E ; 126 used by XIO DRAW command (2 bytes)
+
+; $80 to $FF are free if BASIC and floating point are not used.
+; If BASIC is not used, but FP is, $80 to $D0 are still free.
+; There is no way to use BASIC without constantly using FP, as all BASIC
+; numbers are FP (even "integers" such as line numbers).
+ZROFRE = $80 ; 128 FREE ZERO PAGE, 84 BYTES
+
+; BASIC zero page variables:
+LOMEM = $80 ; 128 LSB, BASIC start-of-memory pointer
+; $81 ; 129 MSB, LOMEM (not to be confused with the OS's MEMLO!)
+VNTP = $82 ; 130 LSB, BASIC start of Variable Name Table pointer
+; $83 ; 131 MSB, VNTP
+VNTD = $84 ; 132 LSB, BASIC end of Variable Name Table pointer (+1 byte)
+; $85 ; 133 MSB, VNTP
+VVTP = $86 ; 134 LSB, BASIC start of Variable Value Table pointer
+; $87 ; 135 MSB, VVTP
+STMTAB = $88 ; 136 LSB, BASIC start of Statement Table pointer
+; $89 ; 137 MSB, STMTAB
+STMCUR = $8A ; 138 LSB, BASIC current statement pointer
+; $8B ; 139 MSB, STMCUR
+STARP = $8C ; 140 LSB, BASIC current string/array table pointer
+; $8D ; 141 MSB, STARP (also points to end of BASIC program)
+RUNSTK = $8E ; 142 LSB, BASIC runtime stack pointer
+; $8F ; 143 MSG, RUNSTK
+; BASIC and the OS both use the name MEMTOP; I've renamed the BASIC one.
+BAS_MEMTOP = $90 ; 144 LSB, pointer to top of BASIC memory
+; $91 ; 145 MSB, BAS_MEMTOP
+MEOLFLG = $92 ; 146 "modified EOL flag register", whatever that is
+; $93 ; 147 listed as "spare" by Mapping's Errata
+;COX = $94 ; 148 current output index (?)
+POKADR = $95 ; 149 LSB, address of last POKE location
+; ; 150 MSB, POKADR
+
+; Locations $96 to $B5 are used for various purposes by BASIC,
+; and most of them are of little or no interest, even for someone
+; writing assembly code meant to run as a USR() routine, so I haven't
+; bothered listing them all here. See Compute! Books' "Atari BASIC Sourcebook"
+; for the gory details. In fact, you can see it here:
+
+; http://users.telenet.be/kim1-6502/6502/absb.html
+
+; It's fascinating (at least it is to me)... includes full source code
+; to Atari BASIC!
+
+; DATAD and DATALN are reset to 0 by BASIC RESTORE command.
+DATAD = $B6 ; 182 the data element being read (e.g. 10 for 10th item
+ ; in a DATA statement)
+DATALN = $B7 ; 183 LSB current DATA statement line number
+; $B8 ; 184 MSB, DATALN
+;ERRNUM = $B9 ; 185 Most recent error number. Gets cleared before you
+ ; can PEEK it; use ERRSAVE instead.
+STOPLN = $BA ; 186 LSB, line where a program stopped by STOP/break/error
+; $BB ; 187 MSB, STOPLN
+; what are $BC and $BD for?
+SAVCUR = $BE ; 190 Saves the current line address (LSB?)
+; $BF ; 191 presumably, the MSB of SAVCUR?
+IOCMD = $C0 ; 192, I/O Command (Mapping Errata)
+IODVC = $C1 ; 193, I/O Device (Mapping Errata)
+PROMPT = $C2 ; 194, Prompt character (Mapping Errata, presumably INPUT?)
+ERRSAVE = $C3 ; 195 Error code that caused a stop or TRAP
+;TEMPA = $C4 ; 196 a 2-byte temp
+;ZTEMP2 = $C6 ; 198 a 2-byte temp
+COLOR = $C8 ; 200 Stores color from COLOR command
+PTABW = $C9 ; 201 Number of columns between tab stops
+ ; (for PRINT with commas, not the TAB key)
+LOADFLG = $CA ; 202 Load in progress flag. I can tell you from bitter
+ ; experience that BASIC clears this often.
+
+; $CB - $CF are unused by BASIC or the ASM/ED cart.
+; $D0 and $D1 are unused by BASIC (does that mean they *are* used by ASM/ED?)
+
+; $D2 and $D3 are used by BASIC. Mapping Errata calls them the "BASIC
+; floating-point work area". They get cleared to 0 by BASIC, probably
+; every time a FP number is used (e.g. "POKE 210,1:? PEEK(210)" prints 0).
+; The BASIC source code labels $D2 as TVTYPE and VTYPE, and $D3 as
+; TVNUM and VNUM.
+
+; Floating point zero page variables:
+FPZRO = $D4 ; 212 FLOATING POINT RAM, 43 BYTES
+ ; (20070530 bkw: pretty sure that comment is wrong, and
+ ; should read 44 bytes; see $FF below)
+FR0 = $D4 ; 212 FP REGISTER 0 (also used by BASIC for USR() return val)
+ ; (FR0/FRE/FR1/FR2 are each 6 bytes long)
+FRE = $DA ; 218
+FR1 = $E0 ; 224 FP REGISTER 1
+FR2 = $E6 ; 230 FP REGISTER 2
+FRX = $EC ; 236 SPARE
+EEXP = $ED ; 237 VALUE OF E
+NSIGN = $ED ; 237 SIGN OF FP NUMBER
+ESIGN = $EF ; 239 SIGN OF FP EXPONENT
+FCHFLG = $F0 ; 240 FIRST CHARACTER FLAG
+DIGRT = $F1 ; 241 NUMBER OF DIGITS RIGHT OF DECIMAL POINT
+CIX = $F2 ; 242 INPUT INDEX
+INBUFF = $F3 ; 243 POINTER TO ASCII FP NUMBER
+ZTEMP1 = $F5 ; 245
+ZTEMP4 = $F7 ; 247
+ZTEMP3 = $F9 ; 249
+DEGFLG = $FB ; 251
+RADFLG = $FB ; 251 0=RADIANS, 6=DEGREES
+FLPTR = $FC ; 252 POINTER TO BCD FP NUMBER (2 bytes)
+FPTR2 = $FE ; 254 maybe a 2nd pointer to an FP number? (2 bytes)
+; $FF ; 255 This *definitely* is used by the FP package
+ ; Try: POKE 255,0:? SIN(1):? PEEK(255)
+
+;
+; PAGE 1
+;
+; 65O2 STACK
+;
+;
+
+;
+;
+; PAGE 2
+;
+;
+; 20070529 bkw: Bytes listed as "spare" should NOT be used for your own
+; purposes. They may not really be unused (just undocumented), and/or they
+; may be unused on the 800 but not the XL (or vice versa).
+INTABS = $0200 ; 512 INTERRUPT RAM
+VDSLST = $0200 ; 512 NMI VECTOR
+VPRCED = $0202 ; 514 PROCEED LINE IRQ VECTOR
+VINTER = $0204 ; 516 INTERRUPT LINE IRQ VECTOR
+VBREAK = $0206 ; 518 break key IRQ vector (not in OS rev. A)
+VKEYBD = $0208 ; 520 keyboard IRQ vector (not break/console keys)
+VSERIN = $020A ; 522 SERIAL INPUT READY IRQ
+VSEROR = $020C ; 524 SERIAL OUTPUT READY IRQ
+VSEROC = $020E ; 526 SERIAL OUTPUT COMPLETE IRQ
+VTIMR1 = $0210 ; 528 TIMER 1 IRQ vector
+VTIMR2 = $0212 ; 530 TIMER 2 IRQ vector
+VTIMR4 = $0214 ; 532 TIMER 4 IRQ vector
+VIMIRQ = $0216 ; 534 IRQ VECTOR
+CDTMV1 = $0218 ; 536 COUNTDOWN TIMER 1 vector
+CDTMV2 = $021A ; 538 COUNTDOWN TIMER 2 vector
+CDTMV3 = $021C ; 540 COUNTDOWN TIMER 3 vector
+CDTMV4 = $021E ; 542 COUNTDOWN TIMER 4 vector
+CDTMV5 = $0220 ; 544 COUNTDOWN TIMER 5 vector
+VVBLKI = $0222 ; 546 immediate VBLANK vector
+VVBLKD = $0224 ; 548 deferred VBLANK vector (ignore if CRITIC != 0)
+CDTMA1 = $0226 ; 550 COUNTDOWN TIMER 1 JSR ADDRESS
+CDTMA2 = $0228 ; 552 COUNTDOWN TIMER 2 JSR ADDRESS
+CDTMF3 = $022A ; 554 COUNTDOWN TIMER 3 FLAG
+SRTIMR = $022B ; 555 REPEAT TIMER
+CDTMF4 = $022C ; 556 COUNTDOWN TIMER 4 FLAG
+INTEMP = $022D ; 557 IAN'S TEMP (used by SETVBL routine)
+CDTMF5 = $022E ; 558 COUNTDOWN TIMER FLAG 5
+SDMCTL = $022F ; 559 DMACTL SHADOW
+SDLSTL = $0230 ; 560 DISPLAY LIST POINTER, LSB (shadow for DLISTL)
+SDLSTH = $0231 ; 561 display list pointer, MSB (shadow for DLISTH)
+SSKCTL = $0232 ; 562 SKCTL SHADOW
+; $0233 ; 563 (800) UNLISTED (Mapping calls this SPARE)
+XL_LCOUNT = $0233 ; 563 (XL) LOADER TEMP
+LPENH = $0234 ; 564 LIGHT PEN HORIZONTAL (shadow for PENH)
+LPENV = $0235 ; 565 LIGHT PEN VERTICAL (shadow for PENV)
+; $0236 ; 566 2 SPARE BYTES on OS rev A
+VBRKKY = $0236 ; 566 Break key interrupt vector (OS rev B and XL)
+BRKKY = VBRKKY ; "OS rev 5" listing calls it this
+; $0238 ; 568 (800) SPARE, 2 BYTES
+;XL_RELADR = $0238 ; 568 (XL) relocatable loader relative addr, 1200XL only!
+XL_VPIRQ = $0238 ; 568 (XL) PBI IRQ vector (not on 1200XL!)
+CDEVIC = $023A ; 570 DEVICE COMMAND FRAME BUFFER
+CAUX1 = $023C ; 572 DEVICE COMMAND AUX 1
+CAUX2 = $023D ; 573 DEVICE COMMAND AUX 2
+TEMP = $023E ; 574 TEMPORARY STORAGE
+ERRFLG = $023F ; 575 DEVICE ERROR FLAG (EXCEPT TIMEOUT)
+DFLAGS = $0240 ; 576 FLAGS FROM DISK SECTOR 1
+DBSECT = $0241 ; 577 NUMBER OF BOOT DISK SECTORS
+BOOTAD = $0242 ; 578 BOOT LOAD ADDRESS POINTER
+COLDST = $0244 ; 580 COLD START FLAG, 1 = COLD START IN PROGRESS
+; $0245 ; 581 (800) SPARE
+XL_RECLEN = $0245 ; 581 (XL) LOADER
+DSKTIM = $0246 ; 582 (800) DISK TIME OUT REGISTER
+; $0246 ; 582 (XL) RESERVED, 39 BYTES
+LINBUF = $0247 ; 583 (800) CHARACTER LINE BUFFER, 40 BYTES
+ ; LINBUF was deleted from the XL OS and replaced with:
+
+; $0247 - $024D are "reserved" on the 1200XL. On other XL's they are:
+XL_PDVMSK = $0247 ; 583 shadow for PBI device selection register @ $D1FF
+XL_SHPDVS = $0248 ; 584 shadow for PBI register (where??)
+XL_PDMSK = $0249 ; 585 PBI interrupt mask
+XL_RELADR = $024A ; 586 (XL) LSB, relocatable loader relative addr (NOT 1200XL)
+; $024B ; 587 MSB, XL_RELADR
+XL_PPTMPA = $024C ; 588 temporaries for relocatable loader
+XL_PPTMPX = $024D ; 589 "
+
+; $024E - $026A are "spare" on all XL/XE's
+
+; More XL stuff:
+XL_CHSALT = $026B ; 619 (XL) CHARACTER SET POINTER (ctrl-F4 on 1200XL)
+XL_VSFLAG = $026C ; 620 (XL) FINE SCROLL TEMPORARY
+XL_KEYDIS = $026D ; 621 (XL) KEYBOARD DISABLE (ctrl-F1 on 1200XL)
+XL_FINE = $026E ; 622 (XL) FINE SCROLL FLAG (POKE 622,255:GR.0)
+
+GPRIOR = $026F ; 623 P/M PRIORITY AND GTIA MODES (shadow for PRIOR)
+;GTIA = $026F ; 623 ; 20070529 bkw: does anyone define this?
+
+; Game controller shadows (joysticks/paddles)
+; Joystick directions and paddle triggers (buttons) are wired to the PIA.
+; Joystick triggers (fire buttons) and the actual paddle potentiometers
+; are wired to the GTIA.
+; If this seems a little odd, that's because it is :)
+
+; Paddles (potentiometers):
+PADDL0 = $0270 ; 624 (XL) 3 MORE PADDLES, (800) 7 MORE PADDLES
+PADDL1 = $0271 ; 625 (these are read in BASIC with PADDLE(x)
+PADDL2 = $0272 ; 626 (PADDL0-7 are shadows for POT0-7)
+PADDL3 = $0273 ; 627
+PADDL4 = $0274 ; 628 (PADDL4-7 are copies of PADDL0-3 on the XL)
+PADDL5 = $0275 ; 629
+PADDL6 = $0276 ; 630
+PADDL7 = $0277 ; 631
+
+; Joysticks (directions only)
+STICK0 = $0278 ; 632 (XL) 1 MORE STICK, (800) 3 MORE STICKS
+STICK1 = $0279 ; 633 (these are read in BASIC with STICK(x)
+STICK2 = $027A ; 634 (STICK0/1 are shadows for PORTA; STICK2/3 shadows PORTB)
+STICK3 = $027B ; 635
+; STICK0 is a shadow for bits 4-7 of PORTA (shifted 4 bits right)
+; STICK1 is a shadow for bits 0-3 of PORTA
+
+; On the 800:
+; STICK2 is a shadow for bits 4-7 of PORTB (shifted 4 bits right)
+; STICK3 is a shadow for bits 0-3 of PORTB
+
+; On the XL/XE series:
+; STICK2 and STICK3 are copies of STICK0 and STICK1, respectively.
+
+; In the XL/XE machines, there are only 2 joystick ports, and PORTB
+; (formerly joystick ports) is now used to control the MMU.
+
+; joystick directions are active low (1=not pressed) and decode as:
+
+; bit direction
+; 0 or 4 up
+; 1 or 5 down
+; 2 or 6 left
+; 3 or 7 right
+
+; A value of $0F in a STICKx register means no direction is being pressed.
+; When a direction is pressed, its bit becomes a logic 0, so e.g. $0E means
+; someone's moving the joystick up.
+
+; (bits 4-7 are only used when reading directly from the HW registers,
+; PORTA and PORTB).
+
+; Paddle triggers (buttons)
+PTRIG0 = $027C ; 636 (XL) 3 MORE PADDLE TRIGGERS, (800) 7 MORE
+PTRIG1 = $027D ; 637 (these are read in BASIC with PTRIG(x))
+PTRIG2 = $027E ; 638 (PTRIG0-3 are shadows for PORTA)
+PTRIG3 = $027F ; 639
+PTRIG4 = $0280 ; 640 (PTRIG4-7 are shadows for PORTB on the 800)
+PTRIG5 = $0281 ; 641 (they are copies of PTRIG0-3 on the XL)
+PTRIG6 = $0282 ; 642
+PTRIG7 = $0283 ; 643
+; In case someone doesn't already know this: The paddle triggers are wired
+; to the same pins on the joystick port as the left/right joystick directions.
+; Each pair of paddles uses left for the first paddle's trigger and right
+; for the second (so PTRIG0/1 are also the left/right bits in STICK0,
+; PTRIG2/3 are STICK1, etc).
+
+; Joystick triggers (buttons)
+STRIG0 = $0284 ; 644 (XL) 1 MORE STICK TRIGGER, (800) 3 MORE
+STRIG1 = $0285 ; 645 (these are read in BASIC with STRIG(x))
+STRIG2 = $0286 ; 646 (STRIG0-3 are shadows for TRIG0-3)
+STRIG3 = $0287 ; 647
+
+; C: handler variables:
+CSTAT = $0288 ; 648 (800) Cassette status register
+; note that CSTAT was deleted from the XL OS, and replaced with:
+XL_HIBYTE = $0288 ; 648 (XL) used by relocatable loader
+WMODE = $0289 ; 649 used by C: handler (0=read, 128-write)
+BLIM = $028A ; 650 cassette buffer data record size
+; $028B ; 651 (800) 5 SPARE BYTES (to $028F)
+XL_IMASK = $028B ; 651 (XL) used by relocatable loader
+XL_JVECK = $028C ; 652 (XL) (Mapping says it's unused)
+ ; 653 (XL) Presumably the MSB of JVECK (unused?)
+XL_NEWADR = $028E ; 654 (XL) LOADER RAM (2 bytes)
+
+; Misc. S: and/or E: handler variables:
+TXTROW = $0290 ; 656
+TXTCOL = $0291 ; 657
+TINDEX = $0293 ; 659 TEXT INDEX
+TXTMSC = $0294 ; 660
+TXTOLD = $0296 ; 662 OLD ROW AND OLD COL FOR TEXT, 2 BYTES
+; $0298 ; 664 4 SPARE BYTES
+TMPX1 = $029C ; 668 (800)
+; note that TMPX1 was deleted from the XL OS, and replaced with:
+XL_CRETRY = $029C ; 668 (XL) NUMBER OF COMMAND FRAME RETRIES
+ ; (moved from CRETRY on 800)
+SUBTMP = $029E ; 670
+HOLD2 = $029F ; 671
+DMASK = $02A0 ; 672
+TMPLBT = $02A1 ; 673
+ESCFLG = $02A2 ; 674
+TABMAP = $02A3 ; 675 15 BYTE BIT MAP FOR TAB SETTINGS
+LOGMAP = $02B2 ; 690 4 BYTE LOGICAL LINE START BIT MAP
+INVFLG = $02B6 ; 694 mask for inverse video ($80=inverse, 0=normal)
+FILFLG = $02B7 ; 695 FILL DURING DRAW FLAG
+TMPROW = $02B8 ; 696
+TMPCOL = $02B9 ; 697
+SCRFLG = $02BB ; 699 SCROLL FLAG
+HOLD4 = $02BC ; 700
+HOLD5 = $02BD ; 701 (800)
+; note that HOLD5 was deleted from the XL OS, and replaced with:
+XL_DRETRY = $02BD ; 701 (XL) NUMBER OF DEVICE RETRIES
+ ; (moved from DRETRY on 800)
+SHFLOC = $02BE ; 702
+BOTSCR = $02BF ; 703 24 NORM, 4 SPLIT
+
+; Color register shadows (HW registers are in GTIA)
+PCOLR0 = $02C0 ; 704 3 MORE PLAYER COLOR REGISTERS (shadows for COLPM0-3)
+PCOLR1 = $02C1 ; 705 (missiles use same color regs as same-numbered players!)
+PCOLR2 = $02C2 ; 706
+PCOLR3 = $02C3 ; 707
+COLOR0 = $02C4 ; 708 4 MORE GRAPHICS COLOR REGISTERS (shadows for COLPF0-3)
+COLOR1 = $02C5 ; 709 (text luminance in GR.0)
+COLOR2 = $02C6 ; 710 (text background and chroma in GR.0)
+COLOR3 = $02C7 ; 711
+COLOR4 = $02C8 ; 712 (background, shadow for COLBK)
+; On boot, system reset, or any time S:/E: devices are opened:
+; PCOLR0-3 are initialzed to 0 ($00, black)
+; COLOR0 is initialized to 40 ($28, orange)
+; COLOR1 is initialized to 202 ($CA, green)
+; COLOR2 is initialized to 148 ($94, blue)
+; COLOR3 is initialized to 70 ($46, red)
+; COLOR4 is initialized to 0 ($00, black)
+
+; $02C9 713 (800) 23 SPARE BYTES
+; XL relocatable handler and other variables:
+XL_RUNADR = $02C9 ; 713 (XL) LOADER VECTOR
+XL_HIUSED = $02CB ; 715 (XL) LOADER VECTOR
+XL_ZHIUSE = $02CD ; 717 (XL) LOADER VECTOR
+XL_GBYTEA = $02CF ; 719 (XL) LOADER VECTOR
+XL_LOADAD = $02D1 ; 721 (XL) LOADER VECTOR
+XL_ZLOADA = $02D3 ; 723 (XL) LOADER VECTOR
+XL_DSCTLN = $02D5 ; 725 (XL) DISK SECTOR SIZ
+XL_ACMISR = $02D7 ; 727 (XL) RESERVED
+XL_KRPDER = $02D9 ; 729 (XL) KEY AUTO REPEAT DELAY
+XL_KEYREP = $02DA ; 730 (XL) KEY AUTO REPEAT RATE
+XL_NOCLIK = $02DB ; 731 (XL) KEY CLICK DISABLE (ctrl-F3 on 1200XL)
+XL_HELPFG = $02DC ; 732 (XL) HELP KEY FLAG
+XL_DMASAV = $02DD ; 733 (XL) SDMCTL (DMA) SAVE (ctrl-F2 on 1200XL)
+XL_PBPNT = $02DE ; 734 (XL) PRINTER BUFFER POINTER (moved from PBPNT on 800)
+XL_PBUFSZ = $02DF ; 735 (XL) PRINTER BUFFER SIZE (moved from PBUFSZ on 800)
+; note that PTEMP was deleted from the XL OS
+
+; DOS/FMS variables:
+GLBABS = $02E0 ; 736 GLOBAL VARIABLES, 4 SPARE BYTES (if DOS not loaded)
+ ; If DOS/FMS is loaded:
+RUNAD = $02E0 ; 736 (DOS) Run address for binary file (LSB/MSB)
+INITAD = $02E2 ; 736 (DOS) Init address for binary file (LSB/MSB)
+
+; SYSEQU.ASM defines these:
+GOADR = RUNAD
+INITADR = INITAD
+
+; OS variables:
+RAMSIZ = $02E4 ; 740 PERMANENT START OF ROM POINTER
+MEMTOP = $02E5 ; 741 END OF FREE RAM
+MEMLO = $02E7 ; 743 LSB, points to bottom of free memory ($0700 if DOS
+ ; not booted). Not to be confused with BASIC's LOMEM!
+; $02E8 ; 744 MSB of MEMLO
+
+; $02E9 ; 745 (800) SPARE
+XL_HNDLOD = $02E9 ; 745 (XL) HANDLER LOADER FLAG
+
+DVSTAT = $02EA ; 746 DEVICE STATUS BUFFER, 4 BYTES
+CBAUDL = $02EE ; 750 CASSETTE BAUD RATE, 2 BYTES
+CRSINH = $02F0 ; 752 1 = INHIBIT CURSOR
+KEYDEL = $02F1 ; 753 KEY DELAY AND RATE (aka debounce counter)
+CH1 = $02F2 ; 754 prior keyboard character code
+CHACT = $02F3 ; 755 (shadow for CHACTL)
+CHBAS = $02F4 ; 756 CHARACTER SET POINTER (shadow for CHBASE)
+
+; These next 4 are located elsewhere on the 800 OS:
+XL_NEWROW = $02F5 ; 757 (XL) DRAW DESTINATION
+XL_NEWCOL = $02F6 ; 758 (XL) DRAW DESTINATION
+XL_ROWINC = $02F8 ; 760 (XL)
+XL_COLINC = $02F9 ; 761 (XL)
+; $02F5 - $02F9 are "spare" on the 800.
+
+CHAR = $02FA ; 762 most recent character read/written (screen code)
+ATACHR = $02FB ; 763 ATASCII CHARACTER FOR CIO
+CH = $02FC ; 764 last key pressed (internal scan code)
+FILDAT = $02FC ; 764 COLOR FOR SCREEN FILL
+DSPFLG = $02FE ; 766 DISPLAY CONTROL CHARACTERS FLAG
+SSFLAG = $02FF ; 767 DISPLAY START/STOP FLAFG
+
+;
+; PAGE 3
+;
+;
+; RESIDENT DISK HANDLER/SIO INTERFACE
+;
+; The DCB is used for SIO (serial I/O).
+DCB = $0300 ; 768 DEVICE CONTROL BLOCK
+DDEVIC = $0300 ; 768 device ID ($31-$38 for D1:-D8:)
+DUNIT = $0301 ; 769 disk/device unit numder
+DCOMND = $0302 ; 770 device command
+DSTATS = $0303 ; 771 status code (set by OS)
+DBUFLO = $0304 ; 772 data buffer LSB (set by user)
+DBUFHI = $0305 ; 773 data buffer MSB (set by user)
+DTIMLO = $0306 ; 774 timeout (set by user, units of 60/64 seconds)
+DUNUSE = $0307 ; 775 unused
+DBYTLO = $0308 ; 776 number of bytes to transfer, LSB
+DBYTHI = $0309 ; 777 number of bytes to transfer, MSB
+DAUX1 = $030A ; 778 LSB of sector number (for disk) (set by user)
+DAUX2 = $030B ; 779 MSB of sector number (for disk)
+TIMER1 = $030C ; 780 INITIAL TIMER VALUE
+ADDCOR = $030E ; 782 (800) ADDITION CORRECTION
+; note that ADDCOR was deleted from the XL OS, and replaced with:
+XL_JMPERS = $030E ; 782 (XL) OPTION JUMPERS
+CASFLG = $030F ; 783 CASSETTE MODE WHEN SET
+TIMER2 = $0310 ; 784 FINAL VALUE, TIMERS 1 & 2 DETERMINE BAUD RATE
+TEMP1 = $0312 ; 786
+XL_TEMP2 = $0313 ; 787 (XL)
+TEMP2 = $0314 ; 788 (800)
+XL_PTIMOT = $0314 ; 788 (XL) PRINTER TIME OUT
+TEMP3 = $0315 ; 789
+SAVIO = $0316 ; 790 SAVE SERIAL IN DATA PORT
+TIMFLG = $0317 ; 791 TIME OUT FLAG FOR BAUD RATE CORRECTION
+STACKP = $0318 ; 792 SIO STACK POINTER SAVE
+TSTAT = $0319 ; 793 TEMPORARY STATUS HOLDER
+HATABS = $031A ; 794 HANDLER ADDRESS TABLE, 38 BYTES
+MAXDEV = $0321 ; 801 MAXIMUM HANDLER ADDRESS INDEX
+XL_PUPBT1 = $033D ; 829 (XL) POWER-UP/RESET
+XL_PUPBT2 = $033E ; 830 (XL) POWER-UP/RESET
+XL_PUPBT3 = $033F ; 831 (XL) POWER-UP/RESET
+
+; IOCB's, 8 of them, 16 bytes each.
+; Set X register to (IOCB number * 16), and use e.g. ICCOM,x
+;
+IOCB = $0340 ; 832 ; IOCB base address
+ICHID = $0340 ; 832 ; Handler ID (set by OS)
+ICDNO = $0341 ; 833 ; Device number (set by OS)
+ICCOM = $0342 ; 834 ; Command byte (see C_* constants) (set by user)
+ICCMD = ICCOM ; ; alternate name for ICCOM, according to Mapping.
+ICSTA = $0343 ; 835 ; Status (set by OS)
+ICBAL = $0344 ; 836 ; Buffer address, LSB (set by user)
+ICBAH = $0345 ; 837 ; Buffer address, MSB (set by user)
+ICPTL = $0346 ; 838 ; Put-one-byte address minus one, LSB (set by OS)
+ICPTH = $0347 ; 839 ; Put-one-byte address minus one, MSB (set by OS)
+ICBLL = $0348 ; 840 ; Buffer length, LSB (set by user)
+ICBLH = $0349 ; 841 ; Buffer length, MSB (set by user)
+ICAX1 = $034A ; 842 ; AUX1 byte (2nd param in BASIC OPEN) (set by user)
+ICAX2 = $034B ; 843 ; AUX2 byte (4rd param in BASIC OPEN) (set by user)
+ICAX3 = $034C ; 844 ; AUX3 byte (used by NOTE/POINT) (set by user)
+ICAX4 = $034D ; 845 ; AUX4 byte (used by NOTE/POINT) (set by user)
+ICAX5 = $034E ; 846 ; AUX5 byte (used by NOTE/POINT) (set by user)
+ICAX6 = $034F ; 847 ; Spare aux byte
+; OTHER IOCB's, 112 BYTES ($300 + $10 * channel)
+
+IOCBLEN = ICAX6-IOCB+1 ; length of one IOCB (from SYSEQU.ASM)
+
+; Alternative names for the above. I found these in SYSEQU.ASM, as
+; distributed with the disk version of Mac65.
+ICBADR = ICBAL
+ICPUT = ICPTL
+ICBLEN = ICBLL
+ICAUX1 = ICAX1
+ICAUX2 = ICAX2
+ICAUX3 = ICAX3
+ICAUX4 = ICAX4
+ICAUX5 = ICAX5
+ICAUX6 = ICAX6
+
+PRNBUF = $03C0 ; 960 PRINTER BUFFER, 40 BYTES
+; $03E8 ; 1000 (800) 21 SPARE BYTES
+XL_SUPERF = $03E8 ; 1000 (XL) SCREEN EDITOR
+XL_CKEY = $03E9 ; 1001 (XL) START KEY FLAG
+XL_CASSBT = $03EA ; 1002 (XL) CASSETTE BOOT FLAG
+XL_CARTCK = $03EB ; 1003 (XL) CARTRIDGE CHECKSUM
+XL_ACMVAR = $03ED ; 1005 (XL) RESERVED, 10 BYTES (to $03F7)
+XL_BASICF = $03F8 ; 1006 (XL) 0 if ROM-BASIC enabled, 1 if not
+XL_MINTLK = $03F9 ; 1017 (XL) RESERVED
+XL_GINTLK = $03FA ; 1018 (XL) CARTRIDGE INTERLOCK
+XL_CHLINK = $03FB ; 1019 (XL) HANDLER CHAIN, 2 BYTES
+CASBUF = $03FD ; 1021 CASSETTE BUFFER, 131 BYTES TO $047F
+
+; Layout of the cassette buffer after a cassette block is read:
+
+; Baud correction ($55 $55) bytes are located at offsets 0 and 1
+; Control byte is at offset 2 ($03FF):
+; Actual data (128 bytes) runs from offset 3 ($0400) to $047F.
+; Each cassette frame has a 1 byte checksum after the 128 data bytes, but
+; the checksum is NOT stored anywhere in the cassette buffer!
+
+; CONTROL BYTE VALUES
+; Value Meaning
+; 250 ($FA) Partial record follows. The actual number of bytes is stored
+; in the last byte of the record (CASBUF+130, or $047F).
+; 252 ($FC) Record full; 128 bytes follow.
+; 254 ($FE) End of File (EOF) record; followed by 128 zero bytes.
+
+; Boot tapes normally don't have partial or EOF records, but BASIC
+; CLOAD/LOAD/LIST and data file tapes do.
+
+; Mapping the Atari says the first disk boot sector is read into CASBUF also.
+
+;
+;
+; PAGE 4
+;
+;
+USAREA = $0480 ; 1152 128 SPARE BYTES (but used by BASIC)
+;
+; SEE APPENDIX C FOR PAGES 4 AND 5 USAGE
+
+;
+;
+;
+;
+; PAGE 5
+;
+PAGE5 = $0500 ; 1280 127 FREE BYTES
+; $057E 1406 129 FREE BYTES IF FLOATING POINT ROUTINES NOT USED
+;
+;FLOATING POINT NON-ZERO PAGE RAM, NEEDED ONLY IF FP IS USED
+; (20070529 bkw: BASIC constantly uses FP! Also, it uses some of these
+; addresses for its own purposes.)
+;
+LBPR1 = $057E ; 1406 LBUFF PREFIX 1
+LBPR2 = $05FE ; 1534 LBUFF PREFIX 2
+LBUFF = $0580 ; 1408 LINE BUFFER
+PLYARG = $05E0 ; 1504 POLYNOMIAL ARGUMENTS
+FPSCR = $05E6 ; 1510 PLYARG+FPREC
+FPSCR1 = $05EC ; 1516 FPSCR+FPREC
+FSCR = $05E6 ; 1510 =FPSCR
+FSCR1 = $05EC ; 1516 =FPSCR1
+LBFEND = $05FF ; 1535 END OF LBUFF
+
+;
+; PAGE 6
+;
+;
+PAGE6 = $0600 ; 1536 256 FREE BYTES
+
+;
+;
+; PAGE 7
+;
+;
+BOOTRG = $0700 ; 1792 PROGRAM AREA
+; Boot disks (including DOS) are generally loaded here. Also, BASIC RAM
+; (variables and program) starts here, if BASIC is booted without DOS.
+
+; Page 80 (XL): Self-test (aka diagnostic) ROM is mapped at $5000,
+; if enabled with bit 7 of PORTB. Normally only happens if you boot without
+; BASIC, cartridge, tape, or disk... or if the OS detects a memory error
+; during boot.
+
+;
+;
+; UPPER ADDRESSES
+;
+;
+RITCAR = $8000 ;32768 RAM IF NO CARTRIDGE (extends to $9FFF)
+LFTCAR = $A000 ;40960 RAM IF NO CARTRIDGE (extends to $BFFF)
+
+; These 2 are from the Atari System Reference Manual, chapter 12:
+CARTA = LFTCAR
+CARTB = RITCAR
+
+CARTLOC = $BFFA ;49146 cartridge run address (from SYSEQU.ASM)
+
+; Carts were originally 8K only when the 400/800 were first released.
+; There were plans to release 16K programs on two cartridges, but this
+; never happened (the price of 16K ROMs came down, I guess). 16K cartridges
+; go in the left slot, but they actually use the address space for both
+; the right and left slots.
+
+; Mapping the Atari has this to say about cartridges:
+;; Byte Purpose
+;; Left (A) Right(B)
+;; 49146 ($BFFA) 40954 ($9FFA) Cartridge start address (low byte)
+;;
+;; 49147 ($BFFB) 40955 ($9FFB) Cartridge start address (high byte)
+;;
+;; 49148 ($BFFC) 40956 ($9FFC) Reads zero if a cartridge is
+;; inserted, non-zero when no cartridge is present. This information
+;; is passed down to the page zero RAM: if the A cartridge is plugged
+;; in, then location 6 will read one; if the B cartridge is plugged in,
+;; then location 7 will read one; otherwise they will read zero.
+;;
+;; 49149 ($BFFD) 40957 ($9FFD) Option byte. If BIT 0 equals one,
+;; then boot the disk (else there is no disk boot). If BIT 2 equals one,
+;; then initialize and start the cartridge (else initialize but do not
+;; start). If BIT 7 equals one, then the cartridge is a diagnostic
+;; cartridge which will take control, but not initialize the OS (else
+;; non-diagnostic cartridge). Diagnostic cartridges were used by
+;; Atari in the development of the system and are not available to the
+;; public.
+;;
+;; 49150 ($BFFE) 40958 ($9FFE) Cartridge initialization address
+;; low byte.
+;;
+;; 49151 ($BFFF) 40959 ($9FFF) Cartridge initialization address
+;; high byte. This is the address to which the OS will jump during all
+;; powerup and RESETs.
+;;
+;; The OS makes temporary use of locations 36876 to 36896 ($900C to
+;; $9020) to set up vectors for the interrupt handler. See the OS
+;; listings pages 31 and 81. This code was only used in the
+;; development system used to design the Atari.
+
+
+; Page 192
+
+C0PAGE = $C000 ;49152 (800) EMPTY, 4K BYTES
+ ; 20070529 bkw: unmapped address space.
+ ; Mapping the Atari erroneously lists this as "unused ROM".
+ ; There are upgrades to the 800 to give 4K of RAM here
+ ; (for a total of 52K of RAM), or ROM (Omnimon?).
+ ; Also, there is RAM here if you boot the Translator
+ ; disk on an XL.
+
+; (XL) $C000 also contains info about the ROM revision. From Mapping:
+
+;Bytes 49152-49163 ($C000-$C00B) are used to identify the computer
+;and the ROM in the $C000-$DFFF block:
+;
+;Byte Use
+;49152-3/C000-1 Checksum (LSB/MSB) of all the bytes
+; in ROM except the checksum bytes
+; themselves.
+;49154/C002 Revision date, stored in the form
+; DDMMYY. This is DD, day, usually $10.
+;49155/C003 Revision date, month; usually $05.
+;49156/C004 Revision date, year; usually $83.
+;49157/C005 Reserved option byte; reads zero for
+; the 1200, 800XL, and 130XE.
+;49158/C006 Part number in the form AANNNNNN;
+; AA is an ASCII character and
+; NNNNNN is a four-bit BCD digit. This is
+; byte A1.
+;49159-62/C007-A Part number, bytes A2, N1-N6 (each
+; byte has two N values of four bits
+; each).
+;49163/C00B Revision number. Mapping author's 800XL and 130XE say 2.
+
+;C0PAGE = $C000 ;49152 (XL) OS ROM, mostly interrupt handlers
+; $C800 51200 (XL) START OF OS ROM
+CHORG2 = $CC00 ;52224 (XL) INTERNATIONAL CHARACTER SET
+
+
+
+;
+;
+; HARDWARE REGISTERS
+;
+;
+; SEE REGISTER LIST FOR MORE INFORMATION
+;
+;
+
+; GTIA
+GTIA = $D000
+HPOSP0 = $D000 ;53248 (W) ; P/M positions (no shadows)
+HPOSP1 = $D001 ;53249 (W)
+HPOSP2 = $D002 ;53250 (W)
+HPOSP3 = $D003 ;53251 (W)
+HPOSM0 = $D004 ;53252 (W)
+HPOSM1 = $D005 ;53253 (W)
+HPOSM2 = $D006 ;53254 (W)
+HPOSM3 = $D007 ;53255 (W)
+SIZEP0 = $D008 ;53256 (W) ; P/M size regs (no shadows)
+SIZEP1 = $D009 ;53257 (W)
+SIZEP2 = $D00A ;53258 (W)
+SIZEP3 = $D00B ;53259 (W)
+SIZEM = $D00C ;53260 (W)
+M0PF = $D000 ;53248 (R) ; collision regs (no shadows)
+M1PF = $D001 ;53249 (R)
+M2PF = $D002 ;53250 (R)
+M3PF = $D003 ;53251 (R)
+P0PF = $D004 ;53252 (R)
+P1PF = $D005 ;53253 (R)
+P2PF = $D006 ;53254 (R)
+P3PF = $D007 ;53255 (R)
+M0PL = $D008 ;53256 (R)
+M1PL = $D009 ;53257 (R)
+M2PL = $D00A ;53258 (R)
+M3PL = $D00B ;53259 (R)
+P0PL = $D00C ;53260 (R)
+P1PL = $D00D ;53261 (R)
+P2PL = $D00E ;53262 (R)
+P3PL = $D00F ;53263 (R)
+GRAFP0 = $D00D ;53261 (W) ; direct (non-DMA) P/M graphics regs (no shadows)
+GRAFP1 = $D00E ;53262 (W)
+GRAFP2 = $D00F ;53263 (W)
+GRAFP3 = $D010 ;53264 (W)
+GRAFM = $D011 ;53265 (W)
+TRIG0 = $D010 ;53264 (R) ; Joystick triggers (shadows @ STRIG0-3)
+TRIG1 = $D011 ;53265 (R)
+TRIG2 = $D012 ;53266 (R)
+TRIG3 = $D013 ;53267 (R)
+PAL = $D014 ;53268 (R) ; PAL/NTSC detect (no shadow)
+ ; PAL supposedly moved to XL_PALNTS on XL; what was it
+ ; replaced with?
+COLPM0 = $D012 ;53266 (W) ; P/M colors (shadows @ PCOLR0-3)
+COLPM1 = $D013 ;53267 (W)
+COLPM2 = $D014 ;53268 (W)
+COLPM3 = $D015 ;53269 (W)
+COLPF0 = $D016 ;53270 (W) ; Playfield colors (shadows @ COLOR0-3)
+COLPF1 = $D017 ;53271 (W)
+COLPF2 = $D018 ;53272 (W)
+COLPF3 = $D019 ;53273 (W)
+COLBK = $D01A ;53274 (W) ; Background color (shadow @ COLOR4)
+PRIOR = $D01B ;53275 (W) ; GTIA priority (shadow @ GPRIOR)
+GTIAR = $D01B ;53275 (R?)
+VDELAY = $D01C ;53276 (W)
+GRACTL = $D01D ;53277 (W)
+HITCLR = $D01E ;53278 (W), latch
+CONSOL = $D01F ;53279 (W=keyclick spkr, R=console keys)
+
+; $D020 - $D0FF are mirrors of GTIA address space
+; $D100 - $D1FF are supposed to be unused (unmapped) on the 800
+; On the XL, $D100 - $D1FF is switched to device memory during PBI I/O
+
+; POKEY
+POKEY = $D200
+; no shadows for AUDC/AUDF
+AUDF1 = $D200 ;53760 (W) ; Audio frequency 1
+AUDC1 = $D201 ;53761 (W) ; Audio control 1 (distortion/volume)
+AUDF2 = $D202 ;53762 (W)
+AUDC2 = $D203 ;53763 (W)
+AUDF3 = $D204 ;53764 (W)
+AUDC3 = $D205 ;53765 (W)
+AUDF4 = $D206 ;53766 (W)
+AUDC4 = $D207 ;53767 (W)
+
+; POT0-7 shadows at PADDL0-7
+POT0 = $D200 ;53760 (R) ; Paddle positions
+POT1 = $D201 ;53761 (R)
+POT2 = $D202 ;53762 (R)
+POT3 = $D203 ;53763 (R)
+POT4 = $D204 ;53764 (R) ; pots 3-7 don't exist on XL/XE
+POT5 = $D205 ;53765 (R)
+POT6 = $D206 ;53766 (R)
+POT7 = $D207 ;53767 (R)
+
+AUDCTL = $D208 ;53768 (W) ; Audio control (no shadow)
+ALLPOT = $D208 ;53768 (R) (no shadow)
+STIMER = $D209 ;53769 (W) (no shadow)
+KBCODE = $D209 ;53769 (R) (shadow @ CH)
+SKREST = $D20A ;53770 (W) (latch)
+RANDOM = $D20A ;53770 (R) (no shadow)
+POTGO = $D20B ;53771 (W) (latch)
+; $D20C (53772) is unused
+SEROUT = $D20D ;53773 (W) (no shadow)
+SERIN = $D20D ;53773 (R) (no shadow)
+IRQEN = $D20E ;53774 (W) (shadow @ POKMSK)
+IRQST = $D20E ;53774 (R)
+SKCTL = $D20F ;53775 (W) (shadow @ SSKCTL)
+SKSTAT = $D20F ;53775 (R)
+
+; $D210 - $D2FF are mirrors of POKEY address space. The "stereo POKEY"
+; modification adds a second POKEY chip, usually addressed at $D210.
+
+; PIA
+; No shadow regs for PIA regs
+PIA = $D300
+PORTA = $D300 ;54016
+PORTB = $D301 ;54017
+PACTL = $D302 ;54018
+PBCTL = $D303 ;54019
+
+; $D304 - $D3FF are mirrors of PIA address space
+
+; ANTIC
+ANTIC = $D400
+DMACTL = $D400 ;54272 (W) (shadow @ SDMCTL)
+CHACTL = $D401 ;54273 (W) (shadow @ CHACT)
+DLISTL = $D402 ;54274 (W) (shadow @ SDLSTL)
+DLISTH = $D403 ;54275 (W) (shadow @ SDLSTH)
+HSCROL = $D404 ;54276 (W) (no shadow)
+VSCROL = $D405 ;54277 (W) (no shadow)
+; $D406 (54278) is unused
+PMBASE = $D407 ;54279 (W) (no shadow)
+; $D408 (54280) is unused
+CHBASE = $D409 ;54281 (W) (shadow @ CHBAS)
+WSYNC = $D40A ;54282 (W), latch (data written doesn't matter)
+VCOUNT = $D40B ;54283 (R) (no shadow)
+PENH = $D40C ;54284 (R) (shadow @ LPENH)
+PENV = $D40D ;54285 (R) (shadow @ LPENV)
+NMIEN = $D40E ;54286 (W) (no shadow)
+NMIRES = $D40F ;54287 (W), latch?
+NMIST = $D40F ;54287 (R) (no shadow)
+
+; $D410 - $D4FF are mirrors of ANTIC address space
+
+CCNTL = $D500 ;54528 Cartridge control (sometimes used for bankswitching)
+; $D500 - $D5FF is supposed to be all be mapped to CCNTL
+
+; $D600 - $D7FF is unmapped? used by PBI on XL? seems to read all $FF
+
+;
+; FLOATING POINT MATH ROUTINES
+;
+; From Mapping:
+; These entry points are the same on 400/800 and XL OS, though the
+; routines themselves are different (bugfixed/optimized for XL)
+; Also, on the XL, the $D800 area is bankswitched to PBI device ROM,
+; during PBI I/O. Not sure if all of $D800 - $DFFF is switched out
+; or just part of it.
+AFP = $D800 ;55296 ASCII to Floating Point (FP) conversion.
+FASC = $D8E6 ;55526 FP value to ASCII conversion.
+IFP = $D9AA ;55722 Integer to FP conversion
+FPI = $D9D2 ;55762 FP to Integer conversion
+ZFR0 = $DA44 ;55876 Clear FR0 (set all bytes to 0)
+ZF1 = $DA46 ;55878 Clear FR1 (set all bytes to 0) (aka AF1 (De Re))
+FSUB = $DA60 ;55904 FP subtract: FR0 = FR0 - FR1
+FADD = $DA66 ;55910 FP add: FR0 = FR0 + FR1
+FMUL = $DADB ;56027 FP multiply: FR0 = FR0 * FR1
+FDIV = $DB28 ;56104 FP divide: FR0 = FR0 / FR1
+PLYEVL = $DD40 ;56640 FP polynomial evaluation
+FLD0R = $DD89 ;56713 Load FP number into FR0 from 6502 X/Y registers
+FLD0P = $DD8D ;56717 Load FP number into FR0 from FLPTR
+FLD1R = $DD98 ;56728 Load FP number into FR1 from 6502 X/Y registers
+FLD1P = $DD9C ;56732 Load FP number into FR1 from FLPTR
+FST0R = $DDA7 ;56743 Store FP number into 6502 X/Y regs from FR0
+FST0P = $DDAB ;56747 Store FP number from FR0, using FLPTR
+FMOVE = $DDB6 ;56758 Move FP number from FR0 into FR1 (FR1 = FR0)
+EXP = $DDC0 ;56768 FP base e exponentiation
+EXP10 = $DDCC ;56780 FP base 10 exponentiation
+LOG = $DECD ;57037 FP natural logarithm
+LOG10 = $DED1 ;57041 FP base 10 logarithm
+
+;
+;
+; OPERATING SYSTEM
+;
+;
+; MODULE ORIGIN TABLE
+;
+CHORG = $E000 ;57344 CHARACTER SET, 1K
+VECTBL = $E400 ;58368 VECTOR TABLE
+VCTABL = $E480 ;58496 RAM VECTOR INITIAL VALUE TABLE
+CIOORG = $E4A6 ;58534 CIO HANDLER
+INTORG = $E6D5 ;59093 INTERRUPT HANDLER
+SIOORG = $E944 ;59716 SIO DRIVER
+DSKORT = $EDEA ;60906 DISK HANDLER
+PRNORG = $EE78 ;61048 PRINTER HANDLER
+CASORG = $EE78 ;61048 CASSETTE HANDLER
+MONORG = $F0E3 ;61667 MONITOR/POWER UP MODULE
+KBDORG = $F3E4 ;62436 KEYBOARD/DISPLAY HANDLER
+;
+;
+; VECTOR TABLE, CONTAINS ADDRESSES OF CIO ROUTINES IN THE
+; FOLLOWING ORDER. THE ADDRESSES IN THE TABLE ARE TRUE ADDRESSES-1
+;
+; ADDRESS + 0 OPEN
+; + 2 CLOSE
+; + 4 GET
+; + 6 PUT
+; + 8 STATUS
+; + A SPECIAL
+; + C JMP TO INITIALIZATION
+; + F NOT USED
+;
+;
+
+; 20070529 bkw: why are they address minus one? because they are called
+; via RTS: a JSR actually pushes the return address minus one, and RTS
+; increments the address on the stack after popping it. The Atari OS
+; "pretends" to have done a JSR by pushing the address-1 on the stack,
+; then executes RTS, which "returns" to the correct address.
+
+EDITRV = $E400 ;58368 EDITOR
+SCRENV = $E410 ;58384 SCREEN
+KEYBDV = $E420 ;58400 KEYBOARD
+PRINTV = $E430 ;58416 PRINTER
+CASETV = $E440 ;58432 CASSETTE
+;
+; ROM VECTORS
+;
+; 20070529 bkw: These consist of a JMP xxxx instruction in the ROM.
+DSKINV = $E453 ;58451
+CIOV = $E456 ;58454 ; Main CIO entry point!
+SIOV = $E459 ;58457 ; Main SIO entry point!
+SETVBV = $E45C ;58460
+SYSVBV = $E45F ;58463
+VBIVAL = $E460 ;58464 ADR AT VVBLKI (operand of JMP @ $E45F)
+XITVBV = $E462 ;58466 EXIT VBI
+VBIXVL = $E463 ;58467 ADR AT VVBLKD (operand of JMP @ $E462)
+SIOINV = $E465 ;58469
+SENDEV = $E468 ;58472
+INTINV = $E46B ;58475
+CIOINV = $E46E ;58478
+BLKBDV = $E471 ;58481 MEMO PAD MODE (self-test in XL)
+WARMSV = $E474 ;58484 ; warmstart (RESET key jumps here)
+COLDSV = $E477 ;58487 ; coldstart (reboot) the Atari
+RBLOKV = $E47A ;58490
+CSOPIV = $E47D ;58493
+
+; SYSEQU.ASM defines this:
+CIO = CIOV
+
+; XL-only entry points:
+XL_SELFSV = BLKBDV ; self-test (same entry point as 800 memo pad)
+XL_SELFTST = BLKBDV ; alt. name (Mapping)
+XL_PUPDIV = $E480 ;58496 (XL) Power-up ATARI logo (1200XL only), or self-test
+XL_SLFTSV = $E483 ;58499 (XL) Self-test vector (points to $5000)
+XL_PENTV = $E486 ;58502 (XL) Entry to the handler uploaded from peripheral
+ ; or disk (is this for the PBI?)
+XL_PHUNLV = $E489 ;58505 (XL) Entry to uploaded handler unlink (PBI?)
+XL_PHINIV = $E48C ;58508 (XL) Entry to uploaded handler init (PBI?)
+XL_GPDVV = $E48F ;58511 (XL) General-purpose parallel device handler
+ ; (copy to HATABS to use)
+
+;;;;; Here endeth the list of official mnemonics
+
+; Mapping has this to say about the XL ROMs:
+;Byte Use
+;65518/FFEE Revision date D1 and D2 (four-bit BCD)
+;65519/FFEF Revision date M1 and M2
+;65520/FFF0 Revision date Y1 and Y2
+;65521/FFF1 Option byte; should read 1 for the
+; 1200XL (Mapping author's 800XL reads 2)
+;65522-26/FFF2-6 Part number in the form AANNNNNN
+;65527/FFF7 Revision number (again, mine reads 2)
+;65528-9/FFF8-9 Checksum, bytes (LSB/MSB)
+; There don't seem to be any known mnemonics for the above...
+
+; 20061120 bkw: display list stuff. These are not official Atari mnemonics,
+; but they *are* somewhat based on the "Checkers Demo" by Carol Shaw,
+; in the Atari Hardware Manual (she didn't define all these, and she didn't
+; use the "DL_" prefix, probably because her assembler was limited to
+; 6-character labels and/or didn't support the underscore).
+
+; blank lines, 1-8 scanlines high
+DL_BLANK1 = $00
+DL_BLANK2 = $10
+DL_BLANK3 = $20
+DL_BLANK4 = $30
+DL_BLANK5 = $40
+DL_BLANK6 = $50
+DL_BLANK7 = $60
+DL_BLANK8 = $70
+
+; modifier bits..
+DL_VSCROLL = $10
+DL_HSCROLL = $20
+DL_LMS = $40
+DL_DLI = $80
+
+; graphics modes (these are the BASIC modes)
+; If you're more familiar with the ANTIC modes, nobody's forcing you
+; to use these :)
+DL_GR0 = $02
+DL_GR1 = $06
+DL_GR2 = $07
+DL_GR3 = $08
+DL_GR4 = $09
+DL_GR5 = $0A
+DL_GR6 = $0B
+DL_GR7 = $0D
+DL_GR8 = $0F
+DL_GR12 = $04 ; GR. 12-15 only supported by GRAPHICS command on XL/XE,
+DL_GR13 = $05 ; but they exist on all ANTIC revisions
+DL_GR14 = $0C
+DL_GR15 = $0E ; AKA "graphics 7.5"
+; No GRAPHICS mode for ANTIC $03 (true descender) mode
+
+; jump instructions
+DL_JMP = $01 ; jump without vertical blank (used to skip over 1K boundary)
+DL_JVB = $41 ; jump & wait for VBLANK (end of display list)
+
+; How to use the above: here's a sample display list for GR.0, with a DLI
+; on screen line 10.
+
+; dlist:
+; ; 4*8 = 32 blank lines at start of display
+; byte DL_BLANK8, DL_BLANK8, DL_BLANK8, DL_BLANK8
+;
+; byte DL_GR0 | DL_LMS ; display GR.0 line, and load screen memory address..
+; word screen_ram ; ...from our screen memory (declared elsewhere)
+;
+; ; 8 more GR.0 lines
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+;
+; byte DL_GR0 | DL_DLI ; another GR.0 line, with the DLI bit enabled
+;
+; ; lines 11-24 (14 more GR.0 bytes)
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+; byte DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0, DL_GR0
+;
+; ; that's 24 lines, so finish with a VBLANK
+; byte DL_JVB ; jump (and wait), to...
+; word dlist ; ...the beginning.
diff --git a/src/features.h b/src/features.h
new file mode 100644
index 0000000..ec7d194
--- /dev/null
+++ b/src/features.h
@@ -0,0 +1,102 @@
+#ifndef FEATURES_H
+#define FEATURES_H
+
+
+// #define FEAT_COL64_HACK
+// #define FEAT_COL80_HACK
+
+#ifdef FEAT_COL64_HACK
+#define COLUMNS 64
+#define FEAT_COL80_HACK
+#endif
+
+#if defined(FEAT_TINY) && defined(FEAT_COL80_HACK)
+#error "You may not define both FEAT_TINY and FEAT_COL80_HACK"
+#endif
+
+#ifdef FEAT_TINY
+
+#define FEAT_LOW_RAM_BUFFERS
+#undef FEAT_DYNAMIC_VERSION
+#undef FEAT_VISUAL_BELL
+#undef FEAT_CURSOR_CONTROLS
+#undef FEAT_KEYBOARD_MACROS
+#undef FEAT_TRAFFIC_INDICATOR
+#undef FEAT_ATRACT_AWAY
+#undef FEAT_KEYBOARD_BUFFER
+#undef FEAT_COLOR_COMMAND
+
+#elif defined(FEAT_COL80_HACK)
+
+#define FEAT_LOW_RAM_BUFFERS
+#define FEAT_VISUAL_BELL
+#define FEAT_KEYBOARD_MACROS
+// #define FEAT_TRAFFIC_INDICATOR
+#define FEAT_KEYBOARD_BUFFER
+#define FEAT_COLOR_COMMAND
+
+/* COL80 hack uses 9K of high RAM, so let's disable
+ some bells & whistles. */
+#undef FEAT_DYNAMIC_VERSION
+#undef FEAT_ATRACT_AWAY
+
+/* Do not enable cursor controls with COL80 hack, because they don't work
+ anyway (arrows and deletes not implemented in the driver). Not needed
+ anyway, fujichat.c contains code that does the same thing when COL80
+ is enabled (slower though) */
+#undef FEAT_CURSOR_CONTROLS
+
+#else
+/* Removable features. Compiling with everything turned off
+ (except FEAT_LOW_RAM_BUFFERS!) saves us around 1322 bytes at
+ runtime (including data/bss) */
+
+/* Keep our bigger buffers in low memory, where possible. Saves
+ space in the DATA segment, allowing MEMTOP to be set lower
+ (to make room for more scrollback, or an 80-col driver, etc) */
+#define FEAT_LOW_RAM_BUFFERS
+
+/* Make CTCP version response say "Atari 8-bit" instead of calling
+ get_ostype(). Saves 179 bytes in executable. */
+#define FEAT_DYNAMIC_VERSION
+
+/* Support visual bell. Saves 110 bytes in exe when undef'd. */
+// TODO: make fujiconf not ask about visual bell, too
+#define FEAT_VISUAL_BELL
+
+/* Don't use cursor controls to keep from splitting up the user's
+ edit buffer when packets come in while he's typing. The 80-column
+ version will probably need this disabled.
+ Saves 410 bytes in exe. */
+#define FEAT_CURSOR_CONTROLS
+
+/* Disable the keyboard macros (^W, ^N, Tab at start of line). Saves
+ about 230 bytes in exe. */
+#define FEAT_KEYBOARD_MACROS
+
+/* Have the rs232dev code display up/down arrows in top right of
+ screen. Accesses screen RAM directly, don't use with 80 cols. */
+#define FEAT_TRAFFIC_INDICATOR
+
+/* Set /away on the server when Atari goes into attract mode,
+ clear when user presses a key */
+#define FEAT_ATRACT_AWAY
+
+/* Experimental logging (backlog, scrollback) support. Expect trouble. */
+// TODO: implement!
+// #define FEAT_LOGGING
+
+/* Disable the keyboard prebuffering during serial I/O */
+#define FEAT_KEYBOARD_BUFFER
+
+/* Support /bgcolor and /fgcolor command in FujiChat (instead of having to go
+ back to setup menu to change text colors) */
+#define FEAT_COLOR_COMMAND
+
+/* messing around, not functional yet */
+// #define FEAT_UNICODE_TEST
+
+/* End of features */
+
+#endif
+#endif
diff --git a/src/fuji6432.atr b/src/fuji6432.atr
new file mode 100644
index 0000000..f77c6dd
--- /dev/null
+++ b/src/fuji6432.atr
Binary files differ
diff --git a/src/fuji80.atr b/src/fuji80.atr
new file mode 100644
index 0000000..d8757ba
--- /dev/null
+++ b/src/fuji80.atr
Binary files differ
diff --git a/src/fuji_asm.s b/src/fuji_asm.s
new file mode 100644
index 0000000..2d9f205
--- /dev/null
+++ b/src/fuji_asm.s
@@ -0,0 +1,3016 @@
+;
+; File generated by cc65 v 2.12.9
+;
+ .fopt compiler,"cc65 v 2.12.9"
+ .setcpu "6502"
+ .smart on
+ .autoimport on
+ .case on
+ .debuginfo off
+ .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
+ .macpack longbranch
+ .import _stdout
+ .import _fflush
+ .import _fputs
+ .import _printf
+ .import _putchar
+ .import _puts
+ .import _sprintf
+ .import _atoi
+ .import _exit
+ .import _strcmp
+ .import _strcpy
+ .import _strlen
+ .import _memcmp
+ .import _memcpy
+ .import _strcasecmp
+ .import _toupper
+ .import _get_ostype
+ .import _kbhit
+ .import _cgetc
+ .import _cursor
+ .import __clocks_per_sec
+ .import _clock
+ .import _timer_set
+ .import _timer_reset
+ .import _timer_expired
+ .export _resolv_found
+ .import _resolv_conf
+ .import _resolv_init
+ .import _resolv_query
+ .import _telnet_send
+ .export _telnet_connected
+ .export _telnet_closed
+ .export _telnet_sent
+ .export _telnet_aborted
+ .export _telnet_timedout
+ .export _telnet_newdata
+ .import _uip_init
+ .import _uip_connect
+ .import _htons
+ .import _uip_len
+ .import _uip_conn
+ .import _uip_conns
+ .import _uip_udp_conn
+ .import _uip_udp_conns
+ .import _uip_flags
+ .import _uip_process
+ .import _uip_hostaddr
+ .import _uip_netmask
+ .import _uip_draddr
+ .import _uiplib_ipaddrconv
+ .import _rs232dev_init
+ .import _rs232dev_send
+ .import _rs232dev_close
+ .import _rs232dev_poll
+ .import _atari_exec_p
+ .import _config
+ .import _format_ip
+ .import _get_config
+ .import _config_is_valid
+ .import _get_line
+ .import _set_default_config
+ .import _disable_break
+ .export _os_version
+ .export _input_buf
+ .export _chan_msg_buf
+ .export _output_buf
+ .export _channel
+ .export _last_msg_nick
+ .export _input_buf_len
+ .export _output_buf_len
+ .export _done
+ .export _connected
+ .export _joined_channel
+ .export _nick_registered
+ .export _vbell_active
+ .export _bell
+ .export _redraw_user_buffer
+ .export _nick_reg_timer
+ .export _tstate
+ .export _vbell_timer
+ .export _main
+ .export _do_pong
+ .export _do_server_msg
+ .export _do_ctcp
+ .export _do_msg
+ .export _del_user_buffer
+
+.segment "DATA"
+
+_os_version:
+ .byte $58,$4C,$5F,$58,$45,$00
+ .res 4,$00
+_input_buf:
+ .word $2900
+_chan_msg_buf:
+ .word $2A00
+_output_buf:
+ .word $2C00
+_last_msg_nick:
+ .byte $00
+ .res 20,$00
+_input_buf_len:
+ .word $0000
+_output_buf_len:
+ .word $0000
+_done:
+ .byte $00
+_connected:
+ .byte $00
+_joined_channel:
+ .byte $00
+_nick_registered:
+ .byte $00
+_vbell_active:
+ .byte $00
+
+.segment "RODATA"
+
+L0001:
+ .byte $38,$30,$30,$00,$31,$32,$30,$30,$58,$4C,$00,$C6,$F5,$EA,$E9,$C3
+ .byte $E8,$E1,$F4,$20,$76,$30,$2E,$35,$00,$53,$65,$72,$76,$65,$72,$20
+ .byte $6E,$61,$6D,$65,$2F,$49,$50,$2C,$20,$5B,$43,$5D,$6F,$6E,$66,$69
+ .byte $67,$2C,$20,$6F,$72,$20,$5B,$44,$5D,$4F,$53,$9B,$00,$5B,$25,$73
+ .byte $5D,$3A,$20,$00,$64,$00,$63,$00,$44,$3A,$46,$55,$4A,$49,$43,$4F
+ .byte $4E,$46,$2E,$43,$4F,$4D,$00,$45,$72,$72,$6F,$72,$20,$25,$64,$21
+ .byte $9B,$00,$2A,$20,$52,$65,$67,$69,$73,$74,$65,$72,$69,$6E,$67,$20
+ .byte $6E,$69,$63,$6B,$00,$4E,$49,$43,$4B,$20,$25,$73,$25,$63,$55,$53
+ .byte $45,$52,$20,$25,$73,$20,$25,$73,$20,$25,$73,$20,$3A,$25,$73,$25
+ .byte $63,$00,$46,$75,$6A,$69,$43,$68,$61,$74,$00,$43,$6F,$6D,$6D,$61
+ .byte $6E,$64,$20,$72,$65,$71,$75,$69,$72,$65,$73,$20,$61,$72,$67,$75
+ .byte $6D,$65,$6E,$74,$00,$59,$6F,$75,$20,$61,$72,$65,$20,$6E,$6F,$74
+ .byte $20,$69,$6E,$20,$61,$20,$63,$68,$61,$6E,$6E,$65,$6C,$20,$28,$75
+ .byte $73,$65,$20,$2F,$6A,$6F,$69,$6E,$20,$23,$63,$68,$61,$6E,$6E,$65
+ .byte $6C,$29,$00,$59,$6F,$75,$20,$61,$72,$65,$20,$61,$6C,$72,$65,$61
+ .byte $64,$79,$20,$69,$6E,$20,$61,$20,$63,$68,$61,$6E,$6E,$65,$6C,$20
+ .byte $28,$75,$73,$65,$20,$2F,$70,$61,$72,$74,$20,$74,$6F,$20,$6C,$65
+ .byte $61,$76,$65,$29,$00,$4E,$41,$4D,$45,$53,$00,$57,$48,$4F,$00,$2F
+ .byte $6D,$73,$67,$20,$25,$73,$20,$00,$50,$52,$49,$56,$4D,$53,$47,$20
+ .byte $25,$73,$20,$3A,$25,$73,$00,$25,$73,$20,$25,$73,$25,$63,$00,$25
+ .byte $73,$25,$63,$00,$50,$52,$49,$56,$4D,$53,$47,$20,$25,$73,$20,$25
+ .byte $63,$56,$45,$52,$53,$49,$4F,$4E,$25,$63,$25,$63,$00,$50,$52,$49
+ .byte $56,$4D,$53,$47,$20,$25,$73,$20,$25,$63,$50,$49,$4E,$47,$20,$25
+ .byte $30,$33,$64,$20,$25,$30,$33,$64,$20,$25,$30,$33,$64,$25,$63,$25
+ .byte $63,$00,$50,$52,$49,$56,$4D,$53,$47,$20,$25,$73,$20,$3A,$25,$63
+ .byte $41,$43,$54,$49,$4F,$4E,$20,$25,$73,$25,$63,$25,$63,$00,$4D,$45
+ .byte $00,$4D,$53,$47,$00,$4D,$00,$50,$52,$49,$56,$4D,$53,$47,$00,$4A
+ .byte $4F,$49,$4E,$00,$4A,$00,$4A,$4F,$49,$4E,$00,$4A,$4F,$49,$4E,$00
+ .byte $50,$41,$52,$54,$00,$50,$41,$52,$54,$00,$56,$45,$52,$53,$49,$4F
+ .byte $4E,$00,$56,$45,$52,$00,$50,$49,$4E,$47,$00,$4E,$49,$43,$4B,$00
+ .byte $2A,$20,$59,$6F,$75,$20,$61,$72,$65,$20,$6E,$6F,$77,$20,$6B,$6E
+ .byte $6F,$77,$6E,$20,$61,$73,$20,$25,$73,$9B,$00,$51,$55,$4F,$54,$45
+ .byte $00,$43,$6F,$6E,$6E,$65,$63,$74,$65,$64,$20,$74,$6F,$20,$73,$65
+ .byte $72,$76,$65,$72,$00,$43,$6F,$6E,$6E,$65,$63,$74,$69,$6F,$6E,$20
+ .byte $63,$6C,$6F,$73,$65,$64,$00,$43,$6F,$6E,$6E,$65,$63,$74,$69,$6F
+ .byte $6E,$20,$61,$62,$6F,$72,$74,$65,$64,$00,$43,$6F,$6E,$6E,$65,$63
+ .byte $74,$69,$6F,$6E,$20,$74,$69,$6D,$65,$64,$20,$6F,$75,$74,$00,$5B
+ .byte $50,$49,$4E,$47,$2C,$50,$4F,$4E,$47,$5D,$00,$2A,$20,$54,$6F,$70
+ .byte $69,$63,$3A,$20,$25,$73,$00,$2A,$20,$54,$6F,$70,$69,$63,$20,$73
+ .byte $65,$74,$20,$62,$79,$20,$25,$73,$00,$2A,$20,$48,$69,$64,$69,$6E
+ .byte $67,$20,$4D,$4F,$54,$44,$20,$28,$62,$65,$20,$70,$61,$74,$69,$65
+ .byte $6E,$74,$29,$00,$25,$64,$20,$25,$73,$00,$25,$73,$20,$25,$73,$00
+ .byte $50,$49,$4E,$47,$20,$00,$2A,$20,$25,$73,$20,$70,$69,$6E,$67,$20
+ .byte $74,$69,$6D,$65,$3A,$20,$25,$64,$2E,$25,$64,$9B,$00,$50,$52,$49
+ .byte $56,$4D,$53,$47,$00,$01,$41,$43,$54,$49,$4F,$4E,$20,$00,$2A,$20
+ .byte $25,$73,$20,$25,$73,$00,$25,$73,$20,$25,$73,$00,$01,$50,$49,$4E
+ .byte $47,$20,$00,$4E,$4F,$54,$49,$43,$45,$20,$25,$73,$20,$3A,$01,$50
+ .byte $49,$4E,$47,$20,$25,$73,$01,$25,$63,$00,$2A,$20,$43,$54,$43,$50
+ .byte $20,$50,$49,$4E,$47,$20,$66,$72,$6F,$6D,$20,$25,$73,$9B,$00,$01
+ .byte $56,$45,$52,$53,$49,$4F,$4E,$01,$00,$4E,$4F,$54,$49,$43,$45,$20
+ .byte $25,$73,$20,$3A,$01,$56,$45,$52,$53,$49,$4F,$4E,$20,$46,$75,$6A
+ .byte $69,$43,$68,$61,$74,$20,$76,$30,$2E,$35,$20,$2D,$20,$72,$75,$6E
+ .byte $6E,$69,$6E,$67,$20,$6F,$6E,$20,$61,$6E,$20,$41,$74,$61,$72,$69
+ .byte $20,$25,$73,$01,$25,$63,$00,$2A,$20,$43,$54,$43,$50,$20,$56,$45
+ .byte $52,$53,$49,$4F,$4E,$20,$66,$72,$6F,$6D,$20,$25,$73,$9B,$00,$4D
+ .byte $53,$47,$3A,$20,$25,$73,$20,$25,$73,$00,$4E,$4F,$54,$49,$43,$45
+ .byte $00,$2A,$20,$43,$54,$43,$50,$20,$72,$65,$70,$6C,$79,$20,$66,$72
+ .byte $6F,$6D,$20,$25,$73,$3A,$20,$25,$73,$00,$25,$73,$20,$25,$73,$20
+ .byte $25,$73,$20,$25,$73,$00,$25,$73,$20,$25,$73,$20,$25,$73,$00,$5B
+ .byte $62,$75,$66,$66,$65,$72,$20,$6F,$76,$65,$72,$66,$6C,$6F,$77,$5D
+ .byte $FD,$00,$50,$49,$4E,$47,$00,$48,$6F,$73,$74,$20,$27,$25,$73,$27
+ .byte $20,$6E,$6F,$74,$20,$66,$6F,$75,$6E,$64,$2E,$9B,$00,$25,$73,$20
+ .byte $69,$73,$20,$25,$73,$9B,$00
+
+.segment "BSS"
+
+_channel:
+ .res 64,$00
+_nick_reg_timer:
+ .res 4,$00
+_tstate:
+ .res 2,$00
+_vbell_timer:
+ .res 4,$00
+
+; ---------------------------------------------------------------
+; void __near__ resolv_found (__near__ unsigned char*, __near__ unsigned int*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _resolv_found: near
+
+.segment "CODE"
+
+ ldy #$00
+ lda (sp),y
+ iny
+ ora (sp),y
+ bne L0501
+ lda #<(L0001+967)
+ ldx #>(L0001+967)
+ jsr pushax
+ ldy #$07
+ jsr pushwysp
+ ldy #$04
+ jsr _printf
+ lda #$01
+ sta _done
+ jmp incsp4
+L0501: lda #<(L0001+989)
+ ldx #>(L0001+989)
+ jsr pushax
+ ldy #$07
+ jsr pushwysp
+ ldy #$07
+ jsr pushwysp
+ jsr _format_ip
+ jsr pushax
+ ldy #$06
+ jsr _printf
+ lda _connected
+ jne incsp4
+ jsr pushw0sp
+ lda _config
+ ldx _config+1
+ ldy #$53
+ jsr pushwidx
+ jsr _htons
+ jsr pushax
+ jsr _uip_connect
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_connected (__near__ struct telnet_state*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_connected: near
+
+.segment "CODE"
+
+ lda #<(L0001+513)
+ ldx #>(L0001+513)
+ jsr _puts
+ jsr ldax0sp
+ sta _tstate
+ stx _tstate+1
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$01
+ sta (sreg),y
+ iny
+ sta (sreg),y
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$03
+ sta (sreg),y
+ iny
+ sta (sreg),y
+ lda #<(_nick_reg_timer)
+ ldx #>(_nick_reg_timer)
+ jsr pushax
+ jsr __clocks_per_sec
+ jsr pushax
+ jsr _timer_set
+ lda #$01
+ sta _connected
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_closed (__near__ struct telnet_state*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_closed: near
+
+.segment "CODE"
+
+ lda #<(L0001+533)
+ ldx #>(L0001+533)
+ jsr _puts
+ lda #$10
+ sta _uip_flags
+ lda #$01
+ sta _done
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_sent (__near__ struct telnet_state*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_sent: near
+
+.segment "CODE"
+
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_aborted (__near__ struct telnet_state*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_aborted: near
+
+.segment "CODE"
+
+ lda #<(L0001+551)
+ ldx #>(L0001+551)
+ jsr _puts
+ lda #$20
+ sta _uip_flags
+ lda #$01
+ sta _done
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_timedout (__near__ struct telnet_state*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_timedout: near
+
+.segment "CODE"
+
+ lda #<(L0001+570)
+ ldx #>(L0001+570)
+ jsr _puts
+ lda #$20
+ sta _uip_flags
+ lda #$01
+ sta _done
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ telnet_newdata (__near__ struct telnet_state*, __near__ unsigned char*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _telnet_newdata: near
+
+.segment "CODE"
+
+ jsr pushw0sp
+ jsr decsp1
+ ldy #$08
+ jsr pushwysp
+ jsr pushc0
+L04AF: ldy #$05
+ jsr ldaxysp
+ sta regsave
+ stx regsave+1
+ jsr decax1
+ ldy #$04
+ jsr staxysp
+ lda regsave
+ ora regsave+1
+ jeq L04B0
+ ldy #$02
+ jsr ldaxysp
+ sta regsave
+ stx regsave+1
+ jsr incax1
+ ldy #$01
+ jsr staxysp
+ ldy #$00
+ lda (regsave),y
+ ldy #$03
+ sta (sp),y
+ cmp #$0A
+ beq L04AF
+ lda (sp),y
+ cmp #$0D
+ bne L04B8
+ lda #$9B
+ sta (sp),y
+ lda #$01
+ ldy #$00
+ jmp L0515
+L04B8: lda (sp),y
+ cmp #$09
+ bne L04BF
+ lda #$7F
+ jmp L0515
+L04BF: lda (sp),y
+ cmp #$7B
+ bne L04C4
+ lda #$DB
+ jmp L0515
+L04C4: lda (sp),y
+ cmp #$7D
+ bne L04C9
+ lda #$DD
+ jmp L0515
+L04C9: lda (sp),y
+ cmp #$7E
+ bne L04CE
+ lda #$DE
+ jmp L0515
+L04CE: lda (sp),y
+ cmp #$60
+ bne L04D3
+ lda #$A7
+L0515: sta (sp),y
+L04D3: lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ sta regsave
+ stx regsave+1
+ jsr incax1
+ sta _output_buf_len
+ stx _output_buf_len+1
+ lda regsave
+ ldx regsave+1
+ jsr tosaddax
+ sta sreg
+ stx sreg+1
+ ldy #$03
+ lda (sp),y
+ ldy #$00
+ sta (sreg),y
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr pushax
+ ldx #$02
+ lda #$00
+ jsr tosicmp
+ bmi L04DA
+ lda #<(L0001+943)
+ ldx #>(L0001+943)
+ jsr _puts
+ lda #$01
+ ldy #$00
+ sta (sp),y
+ jmp L04B0
+L04DA: ldy #$00
+ lda (sp),y
+ jeq L04AF
+ jsr _del_user_buffer
+ lda _output_buf
+ ldx _output_buf+1
+ clc
+ adc _output_buf_len
+ pha
+ txa
+ adc _output_buf_len+1
+ tax
+ pla
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr pushax
+ lda #$05
+ jsr tosgea0
+ beq L04E6
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda #<(L0001+962)
+ ldx #>(L0001+962)
+ jsr pushax
+ ldx #$00
+ lda #$04
+ jsr _memcmp
+ cpx #$00
+ bne L04E6
+ cmp #$00
+ bne L04E6
+ jsr _do_pong
+ jmp L04F5
+L04E6: lda _output_buf
+ ldx _output_buf+1
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$3A
+ bne L04F1
+ jsr _do_msg
+ jmp L04F5
+L04F1: lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _stdout
+ ldx _stdout+1
+ jsr _fputs
+ lda _stdout
+ ldx _stdout+1
+ jsr _fflush
+L04F5: jsr _redraw_user_buffer
+ lda #$00
+ sta _output_buf_len
+ sta _output_buf_len+1
+ tay
+ sta (sp),y
+ jmp L04AF
+L04B0: ldy #$0C
+ jmp addysp
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ handle_keystroke (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _handle_keystroke: near
+
+.segment "CODE"
+
+ jsr decsp2
+ jsr pushc0
+ jsr _cgetc
+ ldy #$01
+ sta (sp),y
+ lda _input_buf_len
+ ora _input_buf_len+1
+ jne L01A9
+ lda (sp),y
+ cmp #$0E
+ beq L01AB
+ cmp #$17
+ beq L01B2
+ cmp #$7F
+ beq L01BB
+ cmp #$9B
+ jeq incsp3
+ jmp L01A9
+L01AB: lda _joined_channel
+ jeq incsp3
+ lda #<(L0001+277)
+ ldx #>(L0001+277)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jsr pushax
+ jsr _send_server_cmd
+ jmp incsp3
+L01B2: lda _joined_channel
+ jeq incsp3
+ lda #<(L0001+283)
+ ldx #>(L0001+283)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jsr pushax
+ jsr _send_server_cmd
+ jmp incsp3
+L01BB: lda _last_msg_nick
+ jeq incsp3
+ lda _input_buf
+ ldx _input_buf+1
+ jsr pushax
+ lda #<(L0001+287)
+ ldx #>(L0001+287)
+ jsr pushax
+ lda #<(_last_msg_nick)
+ ldx #>(_last_msg_nick)
+ jsr pushax
+ ldy #$06
+ jsr _sprintf
+ lda _input_buf
+ ldx _input_buf+1
+ jsr _strlen
+ sta _input_buf_len
+ stx _input_buf_len+1
+ lda #$00
+ ldy #$02
+L0519: sta (sp),y
+ lda (sp),y
+ jsr pusha0
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr tosicmp
+ jcs incsp3
+ lda _input_buf
+ sta sreg
+ lda _input_buf+1
+ sta sreg+1
+ ldy #$02
+ lda (sp),y
+ clc
+ adc sreg
+ ldx sreg+1
+ bcc L0517
+ inx
+L0517: ldy #$00
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ ora #$80
+ jsr _putchar
+ ldy #$02
+ lda (sp),y
+ clc
+ adc #$01
+ jmp L0519
+L01A9: lda (sp),y
+ cmp #$7E
+ bne L01D2
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr pushax
+ lda #$01
+ jsr tosgea0
+ beq L01D4
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr decax1
+ sta _input_buf_len
+ stx _input_buf_len+1
+ ldy #$01
+ ldx #$00
+ lda (sp),y
+ jsr _putchar
+ jmp incsp3
+L01D4: jsr _bell
+ jmp incsp3
+L01D2: lda (sp),y
+ cmp #$9C
+ beq L01DD
+ lda (sp),y
+ cmp #$15
+ bne L01DC
+L01DD: ldx #$00
+ txa
+ sta _input_buf_len
+ sta _input_buf_len+1
+ lda #$9C
+ jsr _putchar
+ jmp incsp3
+L01DC: lda (sp),y
+ cmp #$17
+ bne L01E4
+ jsr _del_last_word
+ jmp incsp3
+L01E4: ldx #$00
+ lda (sp),y
+ ora #$80
+ jsr _putchar
+ ldy #$01
+ lda (sp),y
+ cmp #$9B
+ bne L01E9
+ lda #$0A
+ sta (sp),y
+ tya
+ dey
+ jmp L0518
+L01E9: lda (sp),y
+ cmp #$7F
+ bne L01F0
+ lda #$09
+L0518: sta (sp),y
+L01F0: lda _input_buf
+ ldx _input_buf+1
+ jsr pushax
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ sta regsave
+ stx regsave+1
+ jsr incax1
+ sta _input_buf_len
+ stx _input_buf_len+1
+ lda regsave
+ ldx regsave+1
+ jsr tosaddax
+ sta sreg
+ stx sreg+1
+ ldy #$01
+ lda (sp),y
+ dey
+ sta (sreg),y
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr pushax
+ ldx #$01
+ lda #$00
+ jsr tosicmp
+ bmi L01F9
+ ldy #$00
+ lda (sp),y
+ bne L01F9
+ jsr _bell
+ ldx #$00
+ lda #$7E
+ jsr _putchar
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr decax1
+ sta _input_buf_len
+ stx _input_buf_len+1
+L01F9: ldy #$00
+ lda (sp),y
+ jeq incsp3
+ lda _input_buf
+ ldx _input_buf+1
+ clc
+ adc _input_buf_len
+ pha
+ txa
+ adc _input_buf_len+1
+ tax
+ pla
+ sta sreg
+ stx sreg+1
+ tya
+ sta (sreg),y
+ lda _input_buf
+ sta ptr1
+ lda _input_buf+1
+ sta ptr1+1
+ lda (ptr1),y
+ cmp #$2F
+ bne L0204
+ jsr _handle_command
+ jmp L0214
+L0204: lda _joined_channel
+ beq L0208
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+296)
+ ldx #>(L0001+296)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jsr pushax
+ lda _input_buf
+ ldx _input_buf+1
+ jsr pushax
+ ldy #$08
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ jmp L0214
+L0208: jsr _err_no_channel
+L0214: lda #$00
+ sta _input_buf_len
+ sta _input_buf_len+1
+ jmp incsp3
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ handle_command (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _handle_command: near
+
+.segment "CODE"
+
+ lda _input_buf
+ ldx _input_buf+1
+ jsr incax1
+ jsr pushax
+ jsr decsp2
+ jsr push0
+ ldy #$07
+ jsr pushwysp
+L0261: jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$0A
+ beq L0262
+ jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L0262
+ jsr pushw0sp
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr _toupper
+ ldy #$00
+ jsr staspidx
+ ldx #$00
+ lda #$01
+ jsr addeq0sp
+ jmp L0261
+L0262: jsr ldax0sp
+ ldy #$04
+ jsr staxysp
+ jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$0A
+ beq L026E
+ jsr ldax0sp
+ ldy #$02
+ jsr staxysp
+L0272: ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ bne L0273
+ ldy #$02
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L0272
+L0273: ldy #$03
+ jsr ldaxysp
+ jsr incax1
+ jsr stax0sp
+L0278: jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L0279
+ jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$0A
+ beq L0279
+ ldx #$00
+ lda #$01
+ jsr addeq0sp
+ jmp L0278
+L0279: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+L026E: ldy #$05
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$09
+ jsr pushwysp
+ lda #<(L0001+414)
+ ldx #>(L0001+414)
+ jsr _strcmp
+ cpx #$00
+ bne L0283
+ cmp #$00
+ bne L0283
+ lda _joined_channel
+ bne L0288
+ jsr _err_no_channel
+ jmp incsp8
+L0288: ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L028C
+ jsr _err_missing_arg
+ jmp incsp8
+L028C: ldy #$05
+ jsr pushwysp
+ jsr _do_me
+ jmp incsp8
+L0283: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+417)
+ ldx #>(L0001+417)
+ jsr _strcmp
+ cpx #$00
+ bne L051B
+ cmp #$00
+ beq L0294
+L051B: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+421)
+ ldx #>(L0001+421)
+ jsr _strcmp
+ cpx #$00
+ bne L0293
+ cmp #$00
+ bne L0293
+L0294: ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L029C
+ jsr _err_missing_arg
+ jmp incsp8
+L029C: lda #<(L0001+423)
+ ldx #>(L0001+423)
+ jmp L0524
+L0293: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+431)
+ ldx #>(L0001+431)
+ jsr _strcmp
+ cpx #$00
+ bne L051D
+ cmp #$00
+ beq L02A5
+L051D: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+436)
+ ldx #>(L0001+436)
+ jsr _strcmp
+ cpx #$00
+ bne L02A4
+ cmp #$00
+ bne L02A4
+L02A5: lda _joined_channel
+ beq L02AD
+ ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ beq L02AF
+ jsr _err_already_joined
+ jmp incsp8
+L02AF: lda #<(L0001+438)
+ ldx #>(L0001+438)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jmp L0521
+L02AD: ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ beq L02B7
+ lda #$01
+ sta _joined_channel
+ lda #<(_channel)
+ ldx #>(_channel)
+ jsr pushax
+ ldy #$05
+ jsr ldaxysp
+ jsr _strcpy
+ lda #<(L0001+443)
+ ldx #>(L0001+443)
+ jmp L0524
+L02B7: jsr _err_missing_arg
+ jmp incsp8
+L02A4: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+448)
+ ldx #>(L0001+448)
+ jsr _strcmp
+ cpx #$00
+ bne L02C4
+ cmp #$00
+ bne L02C4
+ lda _joined_channel
+ bne L02C9
+ jsr _err_no_channel
+ jmp incsp8
+L02C9: txa
+ sta _joined_channel
+ lda #<(L0001+453)
+ ldx #>(L0001+453)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jmp L0521
+L02C4: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+458)
+ ldx #>(L0001+458)
+ jsr _strcmp
+ cpx #$00
+ bne L051F
+ cmp #$00
+ beq L02D4
+L051F: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+466)
+ ldx #>(L0001+466)
+ jsr _strcmp
+ cpx #$00
+ bne L02D3
+ cmp #$00
+ bne L02D3
+L02D4: ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L02DC
+ jsr _err_missing_arg
+ jmp incsp8
+L02DC: ldy #$05
+ jsr pushwysp
+ jsr _send_ctcp_version
+ jmp incsp8
+L02D3: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+470)
+ ldx #>(L0001+470)
+ jsr _strcmp
+ cpx #$00
+ bne L02E3
+ cmp #$00
+ bne L02E3
+ ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L02E8
+ jsr _err_missing_arg
+ jmp incsp8
+L02E8: ldy #$05
+ jsr pushwysp
+ jsr _send_ctcp_ping
+ jmp incsp8
+L02E3: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+475)
+ ldx #>(L0001+475)
+ jsr _strcmp
+ cpx #$00
+ bne L02EF
+ cmp #$00
+ bne L02EF
+ ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L02F4
+ jsr _err_missing_arg
+ jmp incsp8
+L02F4: lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr pushax
+ ldy #$05
+ jsr ldaxysp
+ jsr _strcpy
+ ldy #$09
+ jsr pushwysp
+ ldy #$07
+ jsr pushwysp
+ jsr _send_server_cmd
+ lda #<(L0001+480)
+ ldx #>(L0001+480)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr pushax
+ ldy #$04
+ jsr _printf
+ jmp incsp8
+L02EF: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+507)
+ ldx #>(L0001+507)
+ jsr _strcmp
+ cpx #$00
+ bne L0302
+ cmp #$00
+ bne L0302
+ ldy #$03
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L0307
+ jsr _err_missing_arg
+ jmp incsp8
+L0307: ldy #$05
+ jsr pushwysp
+ ldx #$00
+ txa
+ jmp L0521
+L0302: ldy #$07
+ jsr ldaxysp
+L0524: jsr pushax
+ ldy #$05
+ jsr ldaxysp
+L0521: jsr pushax
+ jsr _send_server_cmd
+ jmp incsp8
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ send_server_cmd (__near__ unsigned char*, __near__ unsigned char*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _send_server_cmd: near
+
+.segment "CODE"
+
+ ldy #$01
+ lda (sp),y
+ dey
+ ora (sp),y
+ beq L0219
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+311)
+ ldx #>(L0001+311)
+ jsr pushax
+ ldy #$09
+ jsr pushwysp
+ ldy #$09
+ jsr pushwysp
+ lda #$0A
+ jsr pusha0
+ tay
+ jmp L0525
+L0219: lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+319)
+ ldx #>(L0001+319)
+ jsr pushax
+ ldy #$09
+ jsr pushwysp
+ lda #$0A
+ jsr pusha0
+ ldy #$08
+L0525: jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ bell (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _bell: near
+
+.segment "CODE"
+
+ lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$08
+ bne L015D
+ lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$20
+ beq L0160
+ lda #$01
+ sta _vbell_active
+ lda #<(_vbell_timer)
+ ldx #>(_vbell_timer)
+ jsr pushax
+ jsr __clocks_per_sec
+ jsr pushax
+ lda #$0A
+ jsr tosudiva0
+ jsr pushax
+ jsr _timer_set
+ lda _config
+ ldx _config+1
+ ldy #$93
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ clc
+ adc #$08
+ sta $02C6
+ rts
+L0160: ldx #$00
+ lda #$FD
+ jmp _putchar
+L015D: rts
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ redraw_user_buffer (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _redraw_user_buffer: near
+
+.segment "CODE"
+
+ jsr decsp2
+ ldx #$28
+ lda #$00
+ jsr pushax
+ lda _input_buf_len
+ ora _input_buf_len+1
+ jeq incsp4
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr decax1
+ ldy #$02
+ jsr staxysp
+L049B: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ ldy #$03
+ jsr ldaxysp
+ clc
+ adc sreg
+ sta sreg
+ txa
+ adc sreg+1
+ tax
+ lda sreg
+ sta ptr2
+ stx ptr2+1
+ lda _input_buf
+ sta sreg
+ lda _input_buf+1
+ sta sreg+1
+ ldy #$03
+ jsr ldaxysp
+ clc
+ adc sreg
+ sta sreg
+ txa
+ adc sreg+1
+ tax
+ lda sreg
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ ora #$80
+ sta (ptr2),y
+ ldy #$03
+ jsr ldaxysp
+ sta regsave
+ stx regsave+1
+ jsr decax1
+ ldy #$02
+ jsr staxysp
+ lda regsave
+ ora regsave+1
+ bne L049B
+ jsr ldax0sp
+ clc
+ adc _input_buf_len
+ pha
+ txa
+ adc _input_buf_len+1
+ tax
+ pla
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ jsr pushw0sp
+ lda _stdout
+ ldx _stdout+1
+ jsr _fputs
+ lda _stdout
+ ldx _stdout+1
+ jsr _fflush
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ main (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _main: near
+
+.segment "CODE"
+
+ ldy #$4C
+ jsr subysp
+ jsr _disable_break
+ jsr _get_ostype
+ and #$07
+ ldy #$4B
+ sta (sp),y
+ cmp #$01
+ bne L003B
+ ldy #$FF
+L0040: iny
+ lda L0001,y
+ sta _os_version,y
+ bne L0040
+ jmp L0042
+L003B: lda (sp),y
+ cmp #$02
+ bne L0042
+ ldy #$FF
+L0047: iny
+ lda L0001+4,y
+ sta _os_version,y
+ bne L0047
+L0042: lda #$01
+ jsr _cursor
+ lda #$00
+ sta $02C6
+ lda #$0C
+ sta $02C5
+ ldx #$00
+ lda #$7D
+ jsr _putchar
+ lda #<(L0001+11)
+ ldx #>(L0001+11)
+ jsr _puts
+ ldx #$00
+ lda #$9B
+ jsr _putchar
+ jsr _config_is_valid
+ tax
+ bne L005C
+ jsr _get_config
+ tax
+ bne L005C
+ jsr _set_default_config
+L005C: lda _config
+ ldx _config+1
+ sta sreg
+ stx sreg+1
+ ldy #$96
+ jsr ldaxidx
+ pha
+ txa
+ ora #$10
+ tax
+ pla
+ ldy #$95
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+L0061: lda #$00
+ sta _done
+ jsr _rs232dev_close
+ lda _config
+ ldx _config+1
+ ldy #$93
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta $02C6
+ lda _config
+ ldx _config+1
+ iny
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta $02C5
+ lda #<(L0001+25)
+ ldx #>(L0001+25)
+ jsr pushax
+ ldy #$02
+ jsr _printf
+ lda #<(L0001+61)
+ ldx #>(L0001+61)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$11
+ jsr incaxy
+ jsr pushax
+ ldy #$04
+ jsr _printf
+ lda _stdout
+ ldx _stdout+1
+ jsr _fflush
+ lda sp
+ ldx sp+1
+ jsr pushax
+ lda #$40
+ jsr pusha
+ jsr _get_line
+ lda sp
+ ldx sp+1
+ jsr pushax
+ lda #<(L0001+68)
+ ldx #>(L0001+68)
+ jsr _strcasecmp
+ cpx #$00
+ bne L007B
+ cmp #$00
+ bne L007B
+ jsr _exit
+ jmp L0092
+L007B: lda sp
+ ldx sp+1
+ jsr pushax
+ lda #<(L0001+70)
+ ldx #>(L0001+70)
+ jsr _strcasecmp
+ cpx #$00
+ bne L0083
+ cmp #$00
+ bne L0083
+ lda _atari_exec_p
+ ldx _atari_exec_p+1
+ jsr pushax
+ lda #<(L0001+72)
+ ldx #>(L0001+72)
+ pha
+ ldy #$00
+ lda (sp),y
+ sta jmpvec+1
+ iny
+ lda (sp),y
+ sta jmpvec+2
+ pla
+ jsr jmpvec
+ jsr incsp2
+ ldy #$49
+ jsr staxysp
+ lda #<(L0001+87)
+ ldx #>(L0001+87)
+ jsr pushax
+ ldy #$4E
+ jsr pushwysp
+ ldy #$04
+ jsr _printf
+ ldy #$00
+ jsr _bell
+ jmp L0061
+L0083: ldy #$00
+ lda (sp),y
+ beq L0092
+ lda _config
+ ldx _config+1
+ ldy #$11
+ jsr incaxy
+ jsr pushax
+ lda #$02
+ jsr leaasp
+ jsr _strcpy
+L0092: lda _config
+ ldx _config+1
+ ldy #$10
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jsr pusha
+ jsr _rs232dev_init
+ cmp #$00
+ jne L0061
+ lda #$41
+ jsr leaasp
+ jsr pushax
+ jsr __clocks_per_sec
+ jsr shrax1
+ jsr pushax
+ jsr _timer_set
+ jsr _uip_init
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ jsr incax4
+ jsr pushax
+ ldx #$00
+ lda #$04
+ jsr _memcpy
+ lda #<(_uip_draddr)
+ ldx #>(_uip_draddr)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ jsr incax8
+ jsr pushax
+ ldx #$00
+ lda #$04
+ jsr _memcpy
+ lda #$45
+ jsr leaasp
+ sta sreg
+ stx sreg+1
+ lda #$FF
+ ldy #$00
+ sta (sreg),y
+ iny
+ sta (sreg),y
+ lda #$45
+ jsr leaasp
+ sta sreg
+ stx sreg+1
+ lda #$FF
+ iny
+ sta (sreg),y
+ iny
+ lda #$00
+ sta (sreg),y
+ lda #<(_uip_netmask)
+ ldx #>(_uip_netmask)
+ jsr pushax
+ lda #$47
+ jsr leaasp
+ jsr ldaxi
+ ldy #$00
+ jsr staxspidx
+ lda #<(_uip_netmask)
+ ldx #>(_uip_netmask)
+ jsr pushax
+ lda #$47
+ jsr leaasp
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ jsr staxspidx
+ lda _config
+ ldx _config+1
+ ldy #$11
+ jsr incaxy
+ jsr pushax
+ lda #$47
+ jsr leaasp
+ jsr pushax
+ jsr _uiplib_ipaddrconv
+ tax
+ beq L00E3
+ lda #$45
+ jsr leaasp
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$53
+ jsr pushwidx
+ jsr _htons
+ jsr pushax
+ jsr _uip_connect
+ jmp L00EB
+L00E3: jsr _resolv_init
+ lda _config
+ ldx _config+1
+ ldy #$0C
+ jsr incaxy
+ jsr pushax
+ jsr _resolv_conf
+ lda _config
+ ldx _config+1
+ ldy #$11
+ jsr incaxy
+ jsr pushax
+ jsr _resolv_query
+L00EB: lda _done
+ jne L00F3
+ jsr _rs232dev_poll
+ sta _uip_len
+ stx _uip_len+1
+ cpx #$00
+ bne L0526
+ cmp #$00
+ beq L00F7
+L0526: jsr pushc1
+ jsr _uip_process
+ lda _uip_len
+ ora _uip_len+1
+ jeq L011C
+ jsr _rs232dev_send
+ jmp L011C
+L00F7: lda #$41
+ jsr leaasp
+ jsr pushax
+ jsr _timer_expired
+ stx tmp1
+ ora tmp1
+ jeq L011C
+ lda #$41
+ jsr leaasp
+ jsr pushax
+ jsr _timer_reset
+ ldx #$00
+ txa
+L0529: ldy #$49
+ jsr staxysp
+ jsr pushax
+ lda #$01
+ jsr toslta0
+ beq L0107
+ ldy #$4A
+ jsr ldaxysp
+ jsr pushax
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ sta _uip_conn
+ stx _uip_conn+1
+ jsr pushc2
+ jsr _uip_process
+ lda _uip_len
+ ora _uip_len+1
+ beq L0108
+ jsr _rs232dev_send
+L0108: ldy #$4A
+ jsr ldaxysp
+ jsr incax1
+ jmp L0529
+L0107: ldx #$00
+ txa
+L052A: ldy #$49
+ jsr staxysp
+ jsr pushax
+ lda #$01
+ jsr toslta0
+ beq L011C
+ ldy #$4A
+ jsr ldaxysp
+ jsr pushax
+ lda #$0B
+ jsr tosmula0
+ clc
+ adc #<(_uip_udp_conns)
+ tay
+ txa
+ adc #>(_uip_udp_conns)
+ tax
+ tya
+ sta _uip_udp_conn
+ stx _uip_udp_conn+1
+ lda #$05
+ jsr pusha
+ jsr _uip_process
+ lda _uip_len
+ ora _uip_len+1
+ beq L011D
+ jsr _rs232dev_send
+L011D: ldy #$4A
+ jsr ldaxysp
+ jsr incax1
+ jmp L052A
+L011C: lda _vbell_active
+ beq L0130
+ lda #<(_vbell_timer)
+ ldx #>(_vbell_timer)
+ jsr pushax
+ jsr _timer_expired
+ stx tmp1
+ ora tmp1
+ beq L0130
+ lda _config
+ ldx _config+1
+ ldy #$93
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta $02C6
+ lda #$00
+ sta _vbell_active
+L0130: jsr _kbhit
+ tax
+ beq L013C
+ jsr _handle_keystroke
+L013C: lda _connected
+ jeq L00EB
+ lda _nick_registered
+ jne L00EB
+ lda #<(_nick_reg_timer)
+ ldx #>(_nick_reg_timer)
+ jsr pushax
+ jsr _timer_expired
+ stx tmp1
+ ora tmp1
+ jeq L00EB
+ lda #<(L0001+98)
+ ldx #>(L0001+98)
+ jsr _puts
+ lda _input_buf
+ ldx _input_buf+1
+ jsr pushax
+ lda #<(L0001+117)
+ ldx #>(L0001+117)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr pushax
+ lda #$0A
+ jsr pusha0
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr pushax
+ lda #<(L0001+146)
+ ldx #>(L0001+146)
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$11
+ jsr incaxy
+ jsr pushax
+ lda _config
+ ldx _config+1
+ ldy #$69
+ jsr incaxy
+ jsr pushax
+ lda #$0A
+ jsr pusha0
+ ldy #$12
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _input_buf
+ ldx _input_buf+1
+ jsr pushax
+ lda _input_buf
+ ldx _input_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ lda #$00
+ sta _input_buf_len
+ sta _input_buf_len+1
+ lda #$01
+ sta _nick_registered
+ jmp L00EB
+L00F3: lda #$00
+ sta _joined_channel
+ sta _nick_registered
+ sta _connected
+ jmp L0061
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ err_missing_arg (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _err_missing_arg: near
+
+.segment "CODE"
+
+ lda #<(L0001+155)
+ ldx #>(L0001+155)
+ jsr _puts
+ jmp _bell
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ err_no_channel (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _err_no_channel: near
+
+.segment "CODE"
+
+ lda #<(L0001+181)
+ ldx #>(L0001+181)
+ jsr _puts
+ jmp _bell
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ err_already_joined (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _err_already_joined: near
+
+.segment "CODE"
+
+ lda #<(L0001+227)
+ ldx #>(L0001+227)
+ jsr _puts
+ jmp _bell
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ del_last_word (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _del_last_word: near
+
+.segment "CODE"
+
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr pushax
+ jsr push0
+L017E: lda _input_buf_len
+ ora _input_buf_len+1
+ beq L017F
+ lda _input_buf
+ ldx _input_buf+1
+ clc
+ adc _input_buf_len
+ pha
+ txa
+ adc _input_buf_len+1
+ tax
+ pla
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ bne L017F
+ ldx #$00
+ lda #$01
+ jsr addeq0sp
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr decax1
+ sta _input_buf_len
+ stx _input_buf_len+1
+ jmp L017E
+L017F: lda _input_buf_len
+ ora _input_buf_len+1
+ beq L0187
+ lda _input_buf
+ ldx _input_buf+1
+ clc
+ adc _input_buf_len
+ pha
+ txa
+ adc _input_buf_len+1
+ tax
+ pla
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L0187
+ ldx #$00
+ lda #$01
+ jsr addeq0sp
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr decax1
+ sta _input_buf_len
+ stx _input_buf_len+1
+ jmp L017F
+L0187: ldy #$05
+ jsr pushwysp
+ lda #$79
+ jsr tosgea0
+ beq L018E
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr pushax
+ lda #$79
+ jsr toslta0
+ beq L018E
+ ldx #$00
+ lda #$1C
+ jsr _putchar
+ ldx #$00
+ lda #$9C
+ jsr _putchar
+ ldx #$00
+ lda #$9C
+ jsr _putchar
+ ldy #$00
+ jsr _redraw_user_buffer
+ jmp incsp4
+L018E: ldx #$00
+ lda #$7E
+ jsr _putchar
+ ldx #$00
+ lda #$01
+ ldy #$00
+ jsr subeqysp
+ stx tmp1
+ ora tmp1
+ bne L018E
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ send_ctcp_version (__near__ unsigned char*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _send_ctcp_version: near
+
+.segment "CODE"
+
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+324)
+ ldx #>(L0001+324)
+ jsr pushax
+ ldy #$07
+ jsr pushwysp
+ jsr push1
+ jsr push1
+ lda #$0A
+ jsr pusha0
+ ldy #$0C
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ send_ctcp_ping (__near__ unsigned char*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _send_ctcp_ping: near
+
+.segment "CODE"
+
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+349)
+ ldx #>(L0001+349)
+ jsr pushax
+ ldy #$07
+ jsr pushwysp
+ jsr push1
+ lda $0014
+ jsr pusha0
+ lda $0013
+ jsr pusha0
+ lda $0012
+ jsr pusha0
+ jsr push1
+ lda #$0A
+ jsr pusha0
+ ldy #$12
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ do_me (__near__ unsigned char*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _do_me: near
+
+.segment "CODE"
+
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+386)
+ ldx #>(L0001+386)
+ jsr pushax
+ lda #<(_channel)
+ ldx #>(_channel)
+ jsr pushax
+ jsr push1
+ ldy #$0B
+ jsr pushwysp
+ jsr push1
+ lda #$0A
+ jsr pusha0
+ ldy #$0E
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ do_pong (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _do_pong: near
+
+.segment "CODE"
+
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr _memcpy
+ lda _chan_msg_buf
+ sta sreg
+ lda _chan_msg_buf+1
+ sta sreg+1
+ lda #$4F
+ ldy #$01
+ sta (sreg),y
+L0343: jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L0344
+ jsr ldax0sp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$9B
+ bne L0346
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$0A
+ ldy #$00
+ sta (sreg),y
+L0346: jsr ldax0sp
+ jsr incax1
+ jsr stax0sp
+ jmp L0343
+L0344: lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr pushax
+ jsr _telnet_send
+ lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$40
+ jeq incsp2
+ lda #<(L0001+591)
+ ldx #>(L0001+591)
+ jsr _puts
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ do_server_msg (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _do_server_msg: near
+
+.segment "CODE"
+
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ jsr decsp6
+ jsr push0
+ jsr decsp2
+L0356: ldy #$0B
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L0357
+ ldy #$0A
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L0356
+L0357: ldy #$0A
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ ldy #$0B
+ jsr ldaxysp
+ ldy #$08
+ jsr staxysp
+L035D: ldy #$09
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L035E
+ ldy #$08
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L035D
+L035E: ldy #$09
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$08
+ tax
+ lda #$01
+ jsr addeqysp
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr _strlen
+ jsr stax0sp
+ ldy #$0B
+ jsr pushwysp
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr pushax
+ ldy #$05
+ jsr ldaxysp
+ jsr _memcmp
+ cpx #$00
+ bne L0367
+ cmp #$00
+ bne L0367
+ jsr ldax0sp
+ jsr incax1
+ ldy #$08
+ jsr addeqysp
+L0367: ldy #$0B
+ jsr ldaxysp
+ jsr _atoi
+ ldy #$02
+ jsr staxysp
+ stx tmp1
+ ora tmp1
+ jeq L0370
+ ldy #$03
+ jsr ldaxysp
+ cpx #$01
+ jne L039D
+ cmp #$3B
+ jeq L038C
+ cmp #$4C
+ beq L0379
+ cmp #$4D
+ beq L037E
+ cmp #$60
+ beq L038C
+ cmp #$61
+ beq L038C
+ cmp #$6E
+ beq L038C
+ cmp #$74
+ beq L0383
+ cmp #$76
+ beq L038C
+ cmp #$77
+ beq L038B
+ jmp L039D
+L0379: lda #<(L0001+603)
+ ldx #>(L0001+603)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$04
+ jmp L052B
+L037E: lda #<(L0001+615)
+ ldx #>(L0001+615)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$04
+ jmp L052B
+L0383: lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$10
+ tax
+ lda #$00
+ jsr bnegax
+ beq L03A2
+ ldy #$0B
+ jsr pushwysp
+ lda _stdout
+ ldx _stdout+1
+ jsr _fputs
+ jmp L03A2
+L038B: lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$10
+ beq L038C
+ lda #<(L0001+633)
+ ldx #>(L0001+633)
+ jsr _puts
+ jmp L03A2
+L038C: ldy #$0B
+ jsr pushwysp
+ lda _stdout
+ ldx _stdout+1
+ jsr _fputs
+ jmp L03A2
+L039D: lda #<(L0001+660)
+ ldx #>(L0001+660)
+ jsr pushax
+ ldy #$05
+ jmp L0531
+L0370: lda #<(L0001+666)
+ ldx #>(L0001+666)
+ jsr pushax
+ ldy #$0D
+L0531: jsr ldaxysp
+ jsr pushax
+ ldy #$0F
+ jsr pushwysp
+ ldy #$06
+L052B: jsr _printf
+L03A2: ldy #$0C
+ jmp addysp
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned char __near__ do_ctcp (__near__ unsigned char*, __near__ unsigned char*)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _do_ctcp: near
+
+.segment "CODE"
+
+ ldy #$0C
+ jsr subysp
+ ldy #$0F
+ jsr pushwysp
+ lda #<(L0001+672)
+ ldx #>(L0001+672)
+ jsr pushax
+ ldx #$00
+ lda #$05
+ jsr _memcmp
+ cpx #$00
+ jne L03A8
+ cmp #$00
+ jne L03A8
+ jsr _clock
+ jsr pusheax
+ ldx #$00
+ stx sreg
+ stx sreg+1
+ lda #$0A
+ jsr tosumuleax
+ ldy #$08
+ jsr steaxysp
+ ldy #$0D
+ jsr ldaxysp
+ jsr incax5
+ jsr _atoi
+ jsr axlong
+ jsr pusheax
+ ldy #$11
+ jsr ldaxysp
+ ldy #$09
+ jsr incaxy
+ jsr _atoi
+ jsr axlong
+ ldy sreg
+ sty sreg+1
+ stx sreg
+ tax
+ lda #$00
+ jsr tosaddeax
+ jsr pusheax
+ ldy #$11
+ jsr ldaxysp
+ ldy #$0D
+ jsr incaxy
+ jsr _atoi
+ jsr axlong
+ stx sreg+1
+ sta sreg
+ lda #$00
+ tax
+ jsr tosaddeax
+ jsr pusheax
+ ldx #$00
+ stx sreg
+ stx sreg+1
+ lda #$0A
+ jsr tosmuleax
+ ldy #$04
+ jsr steaxysp
+ ldy #$07
+ jsr ldeaxysp
+ ldy #$08
+ jsr lsubeqysp
+ ldy #$0B
+ jsr ldeaxysp
+ jsr pusheax
+ jsr __clocks_per_sec
+ jsr axulong
+ jsr tosudiveax
+ ldy #$08
+ jsr steaxysp
+ ldy #$0B
+ jsr ldeaxysp
+ jsr pusheax
+ ldx #$00
+ stx sreg
+ stx sreg+1
+ lda #$0A
+ jsr tosdiveax
+ ldy #$02
+ jsr staxysp
+ ldy #$0B
+ jsr ldeaxysp
+ jsr pusheax
+ ldx #$00
+ stx sreg
+ stx sreg+1
+ lda #$0A
+ jsr tosmodeax
+ jsr stax0sp
+ lda #<(L0001+678)
+ ldx #>(L0001+678)
+ jsr pushax
+ ldy #$13
+ jsr pushwysp
+ ldy #$09
+ jsr pushwysp
+ ldy #$09
+ jsr pushwysp
+ ldy #$08
+ jsr _printf
+ ldx #$00
+ lda #$01
+ jmp L03A7
+L03A8: ldx #$00
+ txa
+L03A7: ldy #$10
+ jmp addysp
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ do_msg (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _do_msg: near
+
+.segment "CODE"
+
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ jsr push0
+ jsr push0
+ jsr push0
+L03D0: ldy #$07
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L03D1
+ ldy #$07
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$21
+ bne L03D3
+ ldy #$07
+ jsr ldaxysp
+ jsr stax0sp
+L03D3: ldy #$06
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L03D0
+L03D1: iny
+ lda (sp),y
+ dey
+ ora (sp),y
+ bne L03D8
+ jsr _do_server_msg
+ jmp L03CA
+L03D8: ldy #$07
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$06
+ tax
+ lda #$01
+ jsr addeqysp
+ ldy #$07
+ jsr ldaxysp
+ ldy #$04
+ jsr staxysp
+L03E0: ldy #$05
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L03E1
+ ldy #$04
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L03E0
+L03E1: ldy #$05
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$04
+ tax
+ lda #$01
+ jsr addeqysp
+ ldy #$05
+ jsr ldaxysp
+ ldy #$02
+ jsr staxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$9B
+ beq L03F6
+L03EB: ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L03EC
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$20
+ beq L03EC
+ ldy #$02
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+ jmp L03EB
+L03EC: ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L03F6
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$02
+ tax
+ lda #$01
+ jsr addeqysp
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$3A
+ bne L03F6
+ ldy #$02
+ ldx #$00
+ lda #$01
+ jsr addeqysp
+L03F6: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+701)
+ ldx #>(L0001+701)
+ jsr _strcmp
+ cpx #$00
+ jne L03F9
+ cmp #$00
+ jne L03F9
+ ldy #$09
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$3C
+ ldy #$00
+ sta (sreg),y
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$3E
+ ldy #$00
+ sta (sreg),y
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$01
+ sta (sreg),y
+ ldy #$07
+ jsr pushwysp
+ lda _config
+ ldx _config+1
+ ldy #$54
+ jsr incaxy
+ jsr _strcasecmp
+ cpx #$00
+ bne L0533
+ cmp #$00
+ jeq L0407
+L0533: ldy #$05
+ jsr pushwysp
+ lda #<(L0001+709)
+ ldx #>(L0001+709)
+ jsr pushax
+ ldx #$00
+ lda #$08
+ jsr _memcmp
+ cpx #$00
+ bne L040C
+ cmp #$00
+ bne L040C
+ ldy #$09
+ jsr ldaxysp
+ jsr incax1
+ ldy #$08
+ jsr staxysp
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr decax2
+ jsr tosaddax
+ sta sreg
+ stx sreg+1
+ lda #$9B
+ ldy #$00
+ sta (sreg),y
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr decax1
+ jsr tosaddax
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda #<(L0001+718)
+ ldx #>(L0001+718)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$07
+ jsr ldaxysp
+ jsr incax8
+ jsr pushax
+ ldy #$06
+ jmp L0532
+L040C: lda #<(L0001+726)
+ ldx #>(L0001+726)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$09
+ jsr pushwysp
+ ldy #$06
+ jmp L0532
+L0407: ldy #$05
+ jsr pushwysp
+ lda #<(L0001+732)
+ ldx #>(L0001+732)
+ jsr pushax
+ ldx #$00
+ lda #$06
+ jsr _memcmp
+ cpx #$00
+ jne L0425
+ cmp #$00
+ jne L0425
+ ldy #$09
+ jsr ldaxysp
+ jsr incax1
+ ldy #$08
+ jsr staxysp
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda _output_buf
+ ldx _output_buf+1
+ jsr pushax
+ lda _output_buf_len
+ ldx _output_buf_len+1
+ jsr decax2
+ jsr tosaddax
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+739)
+ ldx #>(L0001+739)
+ jsr pushax
+ ldy #$0F
+ jsr pushwysp
+ ldy #$09
+ jsr ldaxysp
+ jsr incax6
+ jsr pushax
+ lda #$0A
+ jsr pusha0
+ tay
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ lda #<(L0001+762)
+ ldx #>(L0001+762)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$04
+ jmp L0532
+L0425: ldy #$05
+ jsr pushwysp
+ lda #<(L0001+783)
+ ldx #>(L0001+783)
+ jsr pushax
+ ldx #$00
+ lda #$09
+ jsr _memcmp
+ cpx #$00
+ bne L0440
+ cmp #$00
+ bne L0440
+ ldy #$09
+ jsr ldaxysp
+ jsr incax1
+ ldy #$08
+ jsr staxysp
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda #<(L0001+793)
+ ldx #>(L0001+793)
+ jsr pushax
+ ldy #$0F
+ jsr pushwysp
+ lda #<(_os_version)
+ ldx #>(_os_version)
+ jsr pushax
+ lda #$0A
+ jsr pusha0
+ tay
+ jsr _sprintf
+ lda _tstate
+ ldx _tstate+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr pushax
+ lda _chan_msg_buf
+ ldx _chan_msg_buf+1
+ jsr _strlen
+ jsr pushax
+ jsr _telnet_send
+ lda #<(L0001+855)
+ ldx #>(L0001+855)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$04
+ jmp L0532
+L0440: lda #<(L0001+879)
+ ldx #>(L0001+879)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$09
+ jsr pushwysp
+ ldy #$06
+ jsr _printf
+ lda _config
+ ldx _config+1
+ ldy #$96
+ jsr ldaxidx
+ txa
+ and #$80
+ beq L045C
+ jsr _bell
+L045C: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ lda #<(_last_msg_nick)
+ ldx #>(_last_msg_nick)
+ jsr pushax
+ ldy #$0B
+ jsr ldaxysp
+ jsr incax1
+ jsr _strcpy
+ jmp L0482
+L03F9: ldy #$09
+ jsr pushwysp
+ lda #<(L0001+890)
+ ldx #>(L0001+890)
+ jsr _strcmp
+ cpx #$00
+ bne L0465
+ cmp #$00
+ bne L0465
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$01
+ bne L0465
+ ldy #$09
+ jsr ldaxysp
+ jsr incax1
+ ldy #$08
+ jsr staxysp
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ ldy #$0B
+ jsr pushwysp
+ ldy #$05
+ jsr ldaxysp
+ jsr incax1
+ jsr pushax
+ jsr _do_ctcp
+ tax
+ bne L0482
+ lda #<(L0001+897)
+ ldx #>(L0001+897)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$07
+ jsr ldaxysp
+ jsr incax1
+ jsr pushax
+ ldy #$06
+ jmp L0532
+L0465: ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L047A
+ lda #<(L0001+922)
+ ldx #>(L0001+922)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0A
+ jmp L0532
+L047A: lda #<(L0001+934)
+ ldx #>(L0001+934)
+ jsr pushax
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0D
+ jsr pushwysp
+ ldy #$0D
+ jsr pushwysp
+ ldy #$08
+L0532: jsr _printf
+L0482: lda _stdout
+ ldx _stdout+1
+ jsr _fflush
+L03CA: ldy #$0A
+ jmp addysp
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ del_user_buffer (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _del_user_buffer: near
+
+.segment "CODE"
+
+ lda _input_buf_len
+ ora _input_buf_len+1
+ beq L048F
+ ldx #$00
+ lda #$9C
+ jsr _putchar
+ lda _input_buf_len
+ ldx _input_buf_len+1
+ jsr pushax
+ lda #$78
+ jsr tosgea0
+ beq L048F
+ ldx #$00
+ lda #$1C
+ jsr _putchar
+ ldx #$00
+ lda #$9C
+ jmp _putchar
+L048F: rts
+
+.endproc
+
diff --git a/src/fujichat-0.1.atr b/src/fujichat-0.1.atr
new file mode 100644
index 0000000..47f16d0
--- /dev/null
+++ b/src/fujichat-0.1.atr
Binary files differ
diff --git a/src/fujichat-0.3.atr b/src/fujichat-0.3.atr
new file mode 100644
index 0000000..95c2f70
--- /dev/null
+++ b/src/fujichat-0.3.atr
Binary files differ
diff --git a/src/fujichat.atr b/src/fujichat.atr
new file mode 100644
index 0000000..613a085
--- /dev/null
+++ b/src/fujichat.atr
Binary files differ
diff --git a/src/fujichat.atr.ok b/src/fujichat.atr.ok
new file mode 100644
index 0000000..b1f8912
--- /dev/null
+++ b/src/fujichat.atr.ok
Binary files differ
diff --git a/src/fujichat.c b/src/fujichat.c
new file mode 100644
index 0000000..c6412c6
--- /dev/null
+++ b/src/fujichat.c
@@ -0,0 +1,1054 @@
+/*
+ * Copyright (c) 2008, Brian Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgements:
+ * This product includes software developed by Adam Dunkels.
+ * This product includes software developed by Brian Watson.
+ * 4. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the FujiChat IRC client.
+ *
+ */
+
+
+/* standard C includes */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+/* cc65 includes */
+#include <rs232.h>
+#include <peekpoke.h>
+#include <atari.h>
+
+/* uIP includes */
+#include "timer.h"
+#include "uip.h"
+#include "uiplib.h"
+#include "rs232dev.h"
+
+/* FujiChat includes */
+#include "fujichat.h"
+#include "common.h"
+#include "features.h"
+
+#ifdef FEAT_KEYBOARD_MACROS
+#include "keybuf.h"
+#endif
+
+#ifdef FEAT_COL80_HACK
+/* $54 and $55 are ROWCRS and COLCRS.
+ COL80 uses them the same way the OS does. */
+# define fuji_gotox(x) POKE(0x55, x)
+# define fuji_gotoy(y) POKE(0x54, y)
+# define fuji_getxpos() PEEK(0x55)
+# define fuji_getypos() PEEK(0x54)
+
+/* TODO: calculate from RMARGN-LMARGN. Currently COL80 doesn't set RMARGN */
+# ifndef COLUMNS
+# define COLUMNS 80
+# endif
+#endif
+
+
+#ifdef FEAT_DYNAMIC_VERSION
+char os_version[10] = "XL_XE";
+#else
+#define os_version "8-bit"
+#endif
+
+#ifdef FEAT_LOW_RAM_BUFFERS
+#define LOW_RAM_BASE 0x2900
+char *input_buf = (char *)LOW_RAM_BASE; // $2900 - $21FF
+char *serv_msg_buf = (char *)(LOW_RAM_BASE + BUF_SIZE); // $2A00 - $2BFF
+char *output_buf = (char *)(LOW_RAM_BASE + BUF_SIZE + BUF_SIZE * 2); // $2C00 - $2DFF
+#else
+char input_buf[BUF_SIZE];
+char serv_msg_buf[BUF_SIZE * 2];
+char output_buf[OUTBUF_SIZE];
+#endif
+
+char channel[HOSTLEN];
+
+#ifdef FEAT_KEYBOARD_MACROS
+char last_msg_nick[NICKLEN+1] = "";
+#endif
+
+int serv_msg_buf_len = 0;
+int input_buf_len = 0;
+int output_buf_len = 0;
+
+char done = 0;
+char connected = 0;
+char joined_channel = 0; /* true if we're in a channel */
+char nick_registered = 0;
+
+#ifdef FEAT_VISUAL_BELL
+char vbell_active = 0;
+#endif
+
+#ifdef FEAT_ATRACT_AWAY
+char away = 0;
+#endif
+
+static void handle_keystroke(void);
+
+#ifdef FEAT_LOGGING
+static void alloc_log_buffer();
+#endif
+
+#if defined(FEAT_CURSOR_CONTROLS) || defined(FEAT_COL80_HACK)
+void redraw_user_buffer();
+void del_user_buffer();
+#endif
+
+/* uIP API stuff */
+struct timer nick_reg_timer; /* ../uip/timer.h */
+struct telnet_state *tstate; /* ../apps/telnet.h */
+
+#ifdef FEAT_VISUAL_BELL
+struct timer vbell_timer;
+#endif
+
+/*---------------------------------------------------------------------------*/
+void main(void) {
+#ifdef FEAT_DYNAMIC_VERSION
+ char c;
+#endif
+ int i;
+ uip_ipaddr_t ipaddr;
+ struct timer periodic_timer;
+ char cmdbuf[HOSTLEN+1];
+
+ disable_break();
+
+#ifdef FEAT_DYNAMIC_VERSION
+ c = get_ostype() & AT_OS_TYPE_MAIN;
+ if(c == AT_OS_400800) {
+ strcpy(os_version, "800");
+ } else if(c == AT_OS_1200XL) {
+ strcpy(os_version, "1200XL");
+ }
+#endif
+
+ /* set screen colors to white-on-black initially. They may be
+ reset by the user's config file, once it's loaded */
+ POKE(710, 0);
+ POKE(709, 12);
+
+#ifndef FEAT_COL80_HACK
+ fuji_putchar(A_CLR);
+#endif
+
+ puts(BANNER);
+ fuji_putchar('\n');
+
+ if(!config_is_valid()) {
+ if(!get_config())
+ set_default_config();
+ }
+
+#ifdef FEAT_LOGGING
+ alloc_log_buffer();
+#endif
+
+ // config->ui_flags |= UIFLAG_HIDEMOTD; // TODO: make it a preference!
+
+ while(1) {
+ done = 0;
+ rs232dev_close();
+
+ POKE(710, config->bg_color);
+ POKE(709, config->fg_color);
+
+ printf("Server name/IP, [C]onfig, or [D]OS\n");
+ printf("[%s]: ", config->server);
+ fflush(stdout);
+ get_line(cmdbuf, HOSTLEN);
+
+ if(strcasecmp(cmdbuf, "d") == 0) {
+ exit(0);
+ } else if(strcasecmp(cmdbuf, "c") == 0) {
+ i = atari_exec(SETUP_FILENAME);
+ printf("Error %d!\n", i);
+ bell();
+ continue;
+ } else if(*cmdbuf) {
+ strcpy(config->server, cmdbuf);
+ }
+ /* else, use the existing config->server */
+
+ if(rs232dev_init(config->baud) != RS_ERR_OK)
+ continue;
+
+ timer_set(&periodic_timer, CLOCK_SECOND / 2);
+
+ uip_init();
+
+ memcpy(uip_hostaddr, &(config->local_ip), 4);
+ memcpy(uip_draddr, &(config->peer_ip), 4);
+
+ /* can I use 255.255.255.252 here? Does it matter? */
+ uip_ipaddr(ipaddr, 255,255,255,0);
+ uip_setnetmask(ipaddr);
+
+ if(uiplib_ipaddrconv(config->server, (unsigned char*)&ipaddr)) {
+ (void)uip_connect(&ipaddr, htons(config->server_port));
+ } else {
+ resolv_init();
+ resolv_conf((u16_t *)&(config->resolver_ip)); // TODO: fix so I don't need extra ()
+ resolv_query(config->server);
+ }
+
+ while(!done) {
+ /* This part of the while loop is straight from the no-ARP example
+ code, from the uIP docs. */
+ uip_len = rs232dev_poll();
+ if(uip_len > 0) {
+ uip_input();
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ } else if(timer_expired(&periodic_timer)) {
+ timer_reset(&periodic_timer);
+ for(i = 0; i < UIP_CONNS; i++) {
+ uip_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+
+#if UIP_UDP
+ for(i = 0; i < UIP_UDP_CONNS; i++) {
+ uip_udp_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+#endif /* UIP_UDP */
+ }
+
+#ifdef FEAT_VISUAL_BELL
+ if(vbell_active && timer_expired(&vbell_timer)) {
+ POKE(710, config->bg_color);
+ vbell_active = 0;
+ }
+#endif
+
+ /* Call the keyboard handler if the user pressed a key. Note that
+ we're using stdio for printing, but conio for reading, which
+ works on the Atari but may not work on all other cc65 platforms */
+#ifdef FEAT_KEYBOARD_BUFFER
+ /* always call; will return if nothing to do */
+ handle_keystroke();
+#else
+ if(PEEK(764) != 0xff) { /* check CH (replaces kbhit()) */
+ handle_keystroke();
+ }
+#endif
+
+#ifdef FEAT_ATRACT_AWAY
+ if(away && input_buf_len && !(PEEK(77) & 0x80)) {
+ away = 0;
+ send_server_cmd("AWAY", NULL);
+ } else if(!away && (PEEK(77) & 0x80)) {
+ away = 1;
+ send_server_cmd("AWAY", "ATRACT Mode");
+ }
+#endif
+
+ /* Automatically register the nick and userhost after being
+ connected for a couple seconds. The parameters for the USER
+ command are ignored by the server (at least the NewNet servers) */
+ if(connected && !nick_registered && timer_expired(&nick_reg_timer)) {
+ puts("> Registering nick");
+
+ serv_msg_buf_len = sprintf(
+ serv_msg_buf, "NICK %s%cUSER %s %s %s :%s%c",
+ config->nick, NL, config->nick, SELF,
+ config->server, config->real_name, NL);
+ send_serv_msg_buf();
+
+ /*
+ sprintf(input_buf, "NICK %s%cUSER %s %s %s :%s%c",
+ config->nick, NL, config->nick, SELF,
+ config->server, config->real_name, NL);
+ telnet_send(tstate, input_buf, strlen(input_buf));
+ */
+
+ input_buf_len = 0;
+ nick_registered = 1;
+ /* TODO: check for failure registering the nick */
+ }
+
+ /*
+ if(PEEK(53279) == 6) { // START pressed
+ puts("Disconnecting");
+ uip_close();
+ // done = 1;
+ }
+ */
+ }
+
+ connected = nick_registered = joined_channel = 0;
+ }
+ // return 0;
+}
+
+void bell() {
+ if(config->ui_flags & UIFLAG_NOBELL)
+ return;
+
+#ifdef FEAT_VISUAL_BELL
+ if(config->ui_flags & UIFLAG_VBELL) {
+ vbell_active = 1;
+ timer_set(&vbell_timer, CLOCK_SECOND / 10);
+ POKE(710, config->bg_color + 8);
+ return;
+ }
+#endif
+
+#ifndef FEAT_COL80_HACK /* COL80 E: doesn't do the bell character */
+ fuji_putchar(A_BEL);
+#endif
+}
+
+static void err_no_channel(void) {
+ puts("You are not in a channel (use /join #channel)");
+ bell();
+}
+
+#ifdef FEAT_CURSOR_CONTROLS
+static void del_last_word(void) {
+ int old = input_buf_len, bs = 0;
+
+ while(input_buf_len && input_buf[input_buf_len] == ' ') {
+ ++bs;
+ input_buf_len--;
+ }
+
+ while(input_buf_len && input_buf[input_buf_len] != ' ') {
+ ++bs;
+ input_buf_len--;
+ }
+
+ if(old > 120 && input_buf_len <= 120) {
+ fuji_putchar(0x1c);
+ fuji_putchar(A_DEL);
+ fuji_putchar(A_DEL);
+ redraw_user_buffer();
+ } else do {
+ fuji_putchar(A_BS);
+ } while(--bs);
+}
+#endif
+
+#ifdef FEAT_COL80_HACK
+void col80_backspace(char destructive) {
+ char x = fuji_getxpos();
+ char y = fuji_getypos();
+
+ if(x) {
+ --x;
+ } else {
+ x = COLUMNS - 1;
+ --y;
+ }
+
+ fuji_gotox(x);
+ fuji_gotoy(y);
+ if(destructive) {
+ fuji_putchar(' ');
+ fuji_gotox(x);
+ fuji_gotoy(y);
+ }
+}
+
+//void col80_cursor(void) {
+// fuji_putchar(0xa0); /* inverse space */
+// col80_backspace(0);
+//}
+
+# define backspace() col80_backspace(1)
+
+#else
+# define backspace() fuji_putchar(A_BS)
+#endif
+
+/* Keyboard handler. For now, the keyboard macros are hard-coded. */
+static void handle_keystroke(void) {
+ char i, c, send_buf = 0;
+
+ /* TODO:
+ ctrl-7 = ` (warning: cgetc() can't read this)
+ ctrl-, = {
+ ctrl-. = }
+ ctrl-; = ~ (don't do ctrl-^, that's left-arrow!)
+
+ Ignore inverse-video key, ATASCII graphics, unwanted
+ cursor actions, make caps-lock stop freezing the program.
+ To do this right, we have to examine location 764 for some
+ of these, and don't call cgetc() at all... or actually,
+ stuff a valid keycode there, then call cgetc() to make a
+ keyclick noise (but ignore its return value).
+ Addendum - this should be handled in keybuf.s?
+
+ Stock col80 key mappings are warped:
+ ctrl-clear = }
+ ctrl-; = {
+ ctrl-. = `
+ No way to type a tilde because that's the A8 backspace char :(
+
+ */
+#ifdef FEAT_KEYBOARD_BUFFER
+ c = keybuf_cgetc();
+ if(!c) return;
+#else
+ c = fuji_cgetc();
+#endif
+
+#ifdef FEAT_KEYBOARD_MACROS
+ /* Keyboard macros, only allowed at the start of a new line */
+ if(input_buf_len == 0) {
+ switch(c) {
+ case 0x0e: /* ctrl-N */
+ if(joined_channel) send_server_cmd("NAMES", channel);
+ return;
+
+ case 0x17: /* ctrl-W */
+ if(joined_channel) send_server_cmd("WHO", channel);
+ return;
+
+ case A_EOL:
+ return; /* ignore Return on a line by itself */
+
+ case A_TAB:
+ if(last_msg_nick[0]) {
+ sprintf(input_buf, "/msg %s ", last_msg_nick);
+ input_buf_len = strlen(input_buf);
+ for(i=0; i<input_buf_len; i++)
+ fuji_putchar(input_buf[i] | 0x80);
+ }
+ return;
+
+ default:
+ break;
+ }
+ }
+#else
+ if(!input_buf_len && c == A_EOL)
+ return;
+#endif
+
+ /* Editing keys */
+ /* TODO: more editing keys. At minimum:
+ left/right arrows
+ ^W = delete last word
+ ^U = kill to start of line
+ ^K = kill to end of line
+ ^A = goto start of line
+ ^E = goto end of line
+ ^L = redraw input buffer
+ */
+ if(c == A_BS) { /* backspace */
+ if(input_buf_len > 0) {
+ input_buf_len--;
+#ifdef FEAT_COL80_HACK
+ col80_backspace(1);
+ // fuji_putchar(' ');
+ // col80_backspace(0);
+ // col80_cursor();
+#else
+ fuji_putchar(c);
+#endif
+ } else {
+ bell();
+ }
+
+ return;
+ } else if(c == A_DEL || c == 0x15) {
+ /* shift-backspace or ^U (delete line) */
+#ifdef FEAT_COL80_HACK
+ del_user_buffer();
+ // col80_cursor();
+#else
+ fuji_putchar(A_DEL);
+#endif
+ input_buf_len = 0;
+ return;
+#ifdef FEAT_CURSOR_CONTROLS
+ } else if(c == 0x17) {
+ /* ^W (delete word) */
+ del_last_word();
+ return;
+#endif
+ }
+
+ /* Echo keystroke */
+ fuji_putchar(c | 0x80); /* inverse video for now */
+
+ if(c == A_EOL) {
+ c = NL;
+ send_buf = 1;
+ } else if(c == A_TAB) {
+ c = TAB;
+ }
+// #ifdef FEAT_COL80_HACK
+ // else { col80_cursor(); }
+// #endif
+
+
+#ifdef FEAT_UNICODE_TEST
+ if(c == 0x10) { /* ATASCII clubs symbol */
+ input_buf[input_buf_len++] = 0xe2; /* UTF-8 marker */
+ input_buf[input_buf_len++] = 0x99;
+ input_buf[input_buf_len++] = 0xa3;
+ fuji_putchar(c);
+ return;
+ }
+#endif
+
+ /* Store keystroke in input buffer */
+ input_buf[input_buf_len++] = c;
+
+ /* If line too long, ring the "margin" bell */
+ if(input_buf_len > BUF_SIZE - 1)
+ if(!send_buf) {
+ bell();
+ // fuji_putchar(A_BS);
+ backspace();
+ input_buf_len--;
+ }
+
+ /* If we've got a complete line of input and user has pressed Return,
+ send it to the server */
+ if(send_buf) {
+ input_buf[input_buf_len] = '\0';
+
+ if(*input_buf == '/') {
+ handle_command();
+ } else if(joined_channel) {
+ sprintf(serv_msg_buf, "PRIVMSG %s :%s", channel, input_buf);
+ telnet_send(tstate, serv_msg_buf, strlen(serv_msg_buf));
+ } else {
+ err_no_channel();
+ }
+
+ input_buf_len = 0;
+ }
+}
+
+void send_serv_msg_buf(void) {
+ telnet_send(tstate, serv_msg_buf, serv_msg_buf_len);
+}
+
+void send_server_cmd(char *cmd, char *arg) {
+ if(arg) {
+ serv_msg_buf_len = sprintf(serv_msg_buf, "%s %s%c", cmd, arg, NL);
+ } else {
+ serv_msg_buf_len = sprintf(serv_msg_buf, "%s%c", cmd, NL);
+ }
+
+ send_serv_msg_buf();
+}
+
+/* The telnet_* functions are uIP application callbacks. */
+void telnet_connected(struct telnet_state *s) {
+ /* puts("Connected to host, press START to disconnect"); */
+ puts("> Connected to server");
+ tstate = s;
+ s->text = NULL;
+ s->textlen = 0;
+ timer_set(&nick_reg_timer, CLOCK_SECOND);
+ connected = 1;
+}
+
+/* 20081125 bkw: why don't these pragmas do anything? */
+#pragma warn (off)
+void telnet_closed(struct telnet_state *s) {
+ puts("> Connection closed");
+ uip_close();
+ done = 1;
+}
+
+void telnet_sent(struct telnet_state *s) {
+}
+
+void telnet_aborted(struct telnet_state *s) {
+ puts("> Connection aborted");
+ uip_abort();
+ done = 1;
+}
+
+void telnet_timedout(struct telnet_state *s) {
+ puts("> Connection timed out");
+ uip_abort();
+ done = 1;
+}
+#pragma warn (on)
+
+void do_pong() {
+ char *p = serv_msg_buf;
+
+ memcpy(serv_msg_buf, output_buf, output_buf_len);
+ serv_msg_buf[1] = 'O';
+ while(*p) {
+ if(*p == A_EOL) *p = NL;
+ p++;
+ }
+
+ telnet_send(tstate, serv_msg_buf, output_buf_len);
+ if(config->ui_flags & UIFLAG_SHOWPING)
+ puts("[PING,PONG]");
+}
+
+void do_server_msg() {
+ char *cmd = output_buf, *arg;
+ int numeric = 0, len;
+
+ while(*cmd != ' ')
+ ++cmd;
+
+ ++cmd;
+
+ arg = cmd;
+ while(*arg != ' ')
+ ++arg;
+
+ *arg = '\0';
+ ++arg;
+
+ len = strlen(config->nick);
+ if(memcmp(arg, config->nick, len) == 0)
+ arg += (len + 1); // skip nick if present
+
+ if(arg[0] == ':')
+ ++arg;
+
+ /* now cmd points to the command (numeric or whatever),
+ arg points to the rest of the string.
+ Numeric commands we handle now I guess. I think they
+ all have the nick as the 1st argument...
+ */
+ if( (numeric = atoi(cmd)) ) {
+ switch(numeric) {
+ case 332: // topic
+ printf("> Topic: %s", arg);
+ return;
+ break;
+
+ case 333: // topic nick
+ printf("> Topic set by %s", arg);
+ return;
+ break;
+
+ case 375: // start of MOTD
+ case 372: // MOTD text
+ if(config->ui_flags & UIFLAG_HIDEMOTD) {
+ if(numeric == 375)
+ puts("> Hiding MOTD (be patient)");
+ }
+ return;
+ break;
+
+ case 376: // end of MOTD
+ case 422: // or MOTD missing
+ if(*(config->channel)) {
+ strcpy(channel, config->channel);
+ printf("> Joining %s\n", channel);
+ send_server_cmd("JOIN", channel);
+ joined_channel = 1;
+ }
+ break;
+
+ /*
+ case 352: // /who list
+ case 353: // /names list
+ case 366: // end of /names
+ case 315: // end of /who
+ break;
+ */
+
+ default:
+ break;
+ }
+ }
+
+ printf("%s %s", cmd, arg);
+}
+
+char incoming_ctcp(char *nick, char *msg) {
+ long now, then;
+ int sec, dec;
+
+ if(memcmp(msg, "PING ", 5) == 0) {
+ now = clock() * 10L;
+ then = ((long)(atoi(msg + 5)) +
+ ((long)(atoi(msg + 9)) << 8) +
+ ((long)(atoi(msg + 13)) << 16)) * 10L;
+
+ now -= then;
+ now /= CLOCKS_PER_SEC;
+ sec = now / 10;
+ dec = now % 10;
+
+ /* silently ignore timestamp wraparound */
+ /*
+ if(then >= now)
+ return 1;
+ */
+
+ printf("> %s ping time: %d.%d\n", nick, sec, dec);
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Handler for text received from the server, responsible for
+ formatting. TODO: part/join/quit aren't handled correctly. */
+void do_msg() {
+ char *nick = output_buf, *cmd = output_buf, *chan = NULL, *msg = NULL;
+ char *bang = NULL;
+
+ while(*cmd != ' ') {
+ if(*cmd == '!') {
+ bang = cmd;
+ }
+ ++cmd;
+ }
+
+ /* no ! in nick means a server message */
+ if(!bang) {
+ do_server_msg();
+ return;
+ }
+
+ *cmd = '\0';
+ ++cmd;
+ chan = cmd;
+
+ while(*chan != ' ')
+ ++chan;
+ *chan = '\0';
+ ++chan;
+ msg = chan;
+
+ if(*msg != A_EOL) {
+ while(*msg && *msg != ' ')
+ ++msg;
+ if(*msg) {
+ *msg = '\0';
+ ++msg;
+ if(*msg == ':') ++msg;
+ }
+ }
+
+ /* FIXME: This stuff is hairy, unmaintainable, and probably just wrong
+ (works OK with the 2 or 3 NewNet servers I test with, not tried
+ others). It's the result of too much coffee, and needs to be
+ redesigned. Heck, it needs to be designed in the first place! */
+ if(strcmp(cmd, "PRIVMSG") == 0) {
+ nick[0] = '<';
+ bang[0] = '>';
+ bang[1] = '\0';
+ if(strcasecmp(chan, config->nick) != 0) {
+ // privmsg, not to our nick, must be channel text
+ if(memcmp(msg, "\x01" "ACTION ", 8) == 0) {
+ nick++;
+ *bang = '\0';
+ output_buf[output_buf_len - 2] = A_EOL;
+ output_buf[output_buf_len - 1] = '\0';
+ printf("* %s %s", nick, msg + 8);
+ } else {
+ printf("%s %s", nick, msg);
+ }
+ } else {
+ // privmsg, is to our nick
+ if(memcmp(msg, "\x01" "PING ", 6) == 0) {
+ nick++;
+ bang[0] = '\0';
+ output_buf[output_buf_len - 2] = '\0';
+ serv_msg_buf_len = sprintf(serv_msg_buf, "NOTICE %s :\x01PING %s\x01%c",
+ nick, msg + 6, 0x0a);
+ send_serv_msg_buf();
+ printf("* CTCP PING from %s\n", nick);
+ } else if(memcmp(msg, "\x01" "VERSION\x01", 9) == 0) {
+ nick++;
+ *bang = '\0';
+ serv_msg_buf_len = sprintf(serv_msg_buf, "NOTICE %s :\x01VERSION "
+ VERSION_REPLY " - running on "
+ "an Atari %s\x01%c",
+ nick, os_version, 0x0a);
+ send_serv_msg_buf();
+ printf("* CTCP VERSION from %s\n", nick);
+ } else {
+ printf("-> %s %s", nick, msg);
+ if(config->ui_flags & UIFLAG_MSGBELL)
+ bell();
+ bang[0] = '\0';
+#ifdef FEAT_KEYBOARD_MACROS
+ strcpy(last_msg_nick, nick + 1);
+#endif
+ }
+ }
+ } else if((strcmp(cmd, "NOTICE") == 0) && msg[0] == '\x01') {
+ nick++;
+ *bang = '\0';
+ if(!incoming_ctcp(nick, msg+1))
+ printf("* CTCP reply from %s: %s", nick, msg+1); // still has A_EOL
+ } else {
+ if(*msg) {
+ printf("%s %s %s %s", nick, cmd, chan, msg);
+ } else {
+ printf("%s %s %s", nick, cmd, chan);
+ }
+ }
+
+ fflush(stdout);
+}
+
+#ifdef FEAT_CURSOR_CONTROLS
+void del_user_buffer() {
+ /* delete user edit buffer */
+ if(input_buf_len) {
+ fuji_putchar(A_DEL);
+ if(input_buf_len > 119) {
+ fuji_putchar(0x1c); /* up arrow */
+ fuji_putchar(A_DEL);
+ }
+ }
+}
+
+#elif defined(FEAT_COL80_HACK)
+
+/* COL80 doesn't support the delete-line or arrow key
+ control codes.
+
+ Deleting and redrawing the user buffer is done by:
+
+ 1. Move the cursor to the start of the buffer on screen
+ 2. Print input_buf_len spaces
+ 3. Move cursor to the same spot as (1)
+ 4. Print the incoming text including EOL as usual
+ 5. redraw_user_buffer() as usual
+*/
+
+void del_user_buffer() {
+ int tlen;
+ char oldy;
+
+ if(!input_buf_len)
+ return;
+
+ tlen = input_buf_len;
+ oldy = fuji_getypos() - (input_buf_len / COLUMNS);
+
+ fuji_gotox(0);
+ fuji_gotoy(oldy);
+
+ do {
+ fuji_putchar(' ');
+ } while(--tlen);
+
+ fuji_gotox(0);
+ fuji_gotoy(oldy);
+}
+
+#endif
+
+#if defined(FEAT_CURSOR_CONTROLS) || defined(FEAT_COL80_HACK)
+//void redraw_user_buffer() {
+// int tlen;
+//# ifdef FEAT_LOW_RAM_BUFFERS
+//# define redraw_buf ((char *) 0x2800)
+//# else
+// static char redraw_buf[BUF_SIZE];
+//# endif
+// /* reprint user edit buffer */
+// if(input_buf_len) {
+// tlen = input_buf_len - 1;
+// do {
+// redraw_buf[tlen] = input_buf[tlen] | 0x80;
+// } while(tlen--);
+// redraw_buf[input_buf_len] = '\0';
+// fputs(redraw_buf, stdout);
+// fflush(stdout);
+// }
+//}
+
+void redraw_user_buffer() {
+ int i;
+ if(input_buf_len) {
+ for(i=0; i<input_buf_len; ++i)
+ fuji_putchar(input_buf[i] | 0x80);
+ }
+}
+
+#endif
+
+/* Another uIP app callback. This decides whether or not we've received
+ a complete message from the server (which may be split into multiple
+ packets, and may end in the middle of a packet) */
+void telnet_newdata(struct telnet_state *s, char *data, u16_t len) {
+ u16_t tlen = len;
+ char c, *t = data, buf_done = 0;
+
+ while(tlen-- != 0) {
+ c = *t++;
+ if(c == NL) { // swallow NL
+ continue;
+ } else if(c == CR) { // CR => EOL
+ c = A_EOL;
+ buf_done = 1;
+ } else if(c == TAB) { // tab
+ c = A_TAB;
+#ifndef FEAT_COL80_HACK
+ /* COL80 can actually print these OK */
+ } else if(c == '{') {
+ c = '[' | 0x80;
+ } else if(c == '}') {
+ c = ']' | 0x80;
+ } else if(c == '~') {
+ c = '^' | 0x80;
+ } else if(c == 0x60) { // backtick
+ c = 0xa7; // inverse quote
+#endif
+ }
+
+ output_buf[output_buf_len++] = c;
+ if(output_buf_len >= OUTBUF_SIZE) {
+ puts("[buffer overflow]\xfd");
+ buf_done = 1;
+ break;
+ }
+
+ if(buf_done) {
+#if defined(FEAT_CURSOR_CONTROLS) || defined(FEAT_COL80_HACK)
+ del_user_buffer();
+#endif
+ output_buf[output_buf_len] = '\0';
+
+ if(output_buf_len > 4 && (memcmp(output_buf, "PING", 4) == 0)) {
+ do_pong();
+ } else if(output_buf[0] == ':') {
+ do_msg();
+ } else {
+ fputs(output_buf, stdout);
+ fflush(stdout);
+ }
+
+#if defined(FEAT_CURSOR_CONTROLS) || defined(FEAT_COL80_HACK)
+ redraw_user_buffer();
+#endif
+
+#ifdef FEAT_COL80_HACK
+ // col80_cursor();
+#endif
+ output_buf_len = 0;
+ buf_done = 0;
+ }
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+
+/* uIP app callback for the resolver */
+void resolv_found(char *name, u16_t *ipaddr) {
+ if(ipaddr == NULL) {
+ printf("Host '%s' not found.\n", name);
+ done = 1;
+ } else {
+ printf("%s is %s\n", name, format_ip((uip_ipaddr_t *)ipaddr));
+ /*
+ printf("Found name '%s' = %d.%d.%d.%d\n", name,
+ htons(ipaddr[0]) >> 8,
+ htons(ipaddr[0]) & 0xff,
+ htons(ipaddr[1]) >> 8,
+ htons(ipaddr[1]) & 0xff);
+ */
+ if(!connected)
+ (void)uip_connect((uip_ipaddr_t *)ipaddr, htons(config->server_port));
+ }
+}
+
+#ifdef FEAT_LOGGING
+
+/* 0x100 * 32 = 8K (but we likely won't get that much) */
+#define LOG_PAGE_SIZE 0x200
+#define LOG_MAX_PAGES 16
+#define LOG_SCROLL_PAGES 2
+
+static char *log_buffer = NULL;
+static char *log_buf_end = NULL;
+static char *log_buf_current = NULL;
+static int log_pages = LOG_MAX_PAGES;
+
+static char last_log_nick[NICKLEN + 1];
+
+static void alloc_log_buffer() {
+ do {
+ printf("Trying to malloc(%x)...", LOG_PAGE_SIZE * log_pages);
+
+ log_buffer = malloc(LOG_PAGE_SIZE * log_pages);
+
+ if(log_buffer) {
+ puts("OK");
+ } else {
+ puts("Failed");
+ }
+ } while(!log_buffer && (--log_pages > LOG_SCROLL_PAGES * 2));
+
+ if(!log_buffer) return;
+
+ log_buf_end = (char *)(log_pages * LOG_PAGE_SIZE - 1);
+ log_buf_current = log_buffer;
+
+ printf("log_buffer == %x (%x)", log_buffer, log_pages * LOG_PAGE_SIZE);
+ fuji_cgetc();
+}
+
+static void log_msg(char *msg) {
+ int len = strlen(msg);
+ if( (log_buf_current + len + 1) > log_buf_end ) {
+ memmove(log_buffer, log_buffer + (LOG_SCROLL_PAGES * LOG_PAGE_SIZE), (log_pages - LOG_SCROLL_PAGES) * LOG_PAGE_SIZE);
+ log_buf_current -= (LOG_SCROLL_PAGES * LOG_PAGE_SIZE);
+ }
+}
+
+#endif
diff --git a/src/fujichat.cfg b/src/fujichat.cfg
new file mode 100644
index 0000000..974f49e
--- /dev/null
+++ b/src/fujichat.cfg
Binary files differ
diff --git a/src/fujichat.h b/src/fujichat.h
new file mode 100644
index 0000000..6b899ea
--- /dev/null
+++ b/src/fujichat.h
@@ -0,0 +1,136 @@
+#ifndef FUJICHAT_H
+#define FUJICHAT_H
+
+#include "uip.h"
+#include "aexec.h"
+
+/* Program name (plain ASCII for network use) */
+#define SELF "FujiChat"
+/* inverse video version, used for local prompts: */
+#define SELF_INV "\xc6\xf5\xea\xe9\xc3\xe8\xe1\xf4"
+
+#define VERSION "0.5_pre4"
+#define BANNER SELF_INV " v" VERSION
+#define VERSION_REPLY SELF " v" VERSION
+
+#define DEFAULT_NICK SELF
+
+// #define CONF_SIGNATURE "\x03\x0e"
+#define CONF_SIGNATURE_LO 0x03
+#define CONF_SIGNATURE_HI 0x0e
+#define CONF_VERSION 5
+
+#define BUF_SIZE 256
+#define OUTBUF_SIZE 512
+#define NICKLEN 20
+#define HOSTLEN 64
+
+/* fuji_conf_t is stored in the config file verbatim.
+ Don't forget to update CONF_VERSION when changing this struct!
+ Also, the first member should never, ever change, and the 2nd
+ (version) should only ever be set to CONF_VERSION (which can be
+ changed)
+
+ */
+typedef struct {
+ char signature[2];
+ u16_t version;
+
+ /* uIP settings: */
+ uip_ipaddr_t local_ip;
+ uip_ipaddr_t peer_ip;
+ uip_ipaddr_t resolver_ip;
+ char baud;
+
+ /* IRC settings: */
+ char server[HOSTLEN+1];
+ u16_t server_port;
+ char nick[NICKLEN+1];
+ char alt_nick[NICKLEN+1];
+ char real_name[NICKLEN+1];
+ char channel[NICKLEN+1];
+
+ /* UI settings: */
+ char bg_color;
+ char fg_color;
+ u16_t ui_flags; /* bitwise OR of UIFLAG_* constants */
+
+ /* Other stuff: */
+ char timezone; /* for later, when we use /TIME to set the clock */
+} fuji_conf_t;
+
+/* Chunk of RAM that holds our config data. Setup leaves the config
+ here for FujiChat to find. */
+#define CONFIG_ADDRESS 0x500
+
+#define ARGTYPE_NONE 0
+#define ARGTYPE_REQUIRED 1
+#define ARGTYPE_OPT 2
+
+typedef struct {
+ char *cmd; /* e.g. "ME" or "PING" */
+ char arg_type; /* one of ARGTYPE_* constants */
+ void (*handler)(void);
+} fuji_cmd_t;
+
+extern fuji_cmd_t cmd_list[];
+extern char *serv_msg_buf;
+extern int serv_msg_buf_len;
+extern char *cmd_arg;
+extern char channel[];
+extern struct telnet_state *tstate;
+extern char joined_channel;
+extern char *input_buf;
+
+void send_serv_msg_buf(void);
+void send_server_cmd(char *cmd, char *arg);
+void handle_command(void);
+void bell();
+
+/* Filenames */
+#define DEFAULT_CONF_FILE "D:FUJICHAT.CFG"
+#define MENU_FILENAME "D:FUJIMENU.COM"
+#define SETUP_FILENAME "D:FUJICONF.COM"
+#define IRC_FILENAME "D:FUJICHAT.COM"
+// #define IRC_LOADER_FILENAME "D:LOADCHAT.COM"
+#define SERIAL_DRIVER_FILENAME "D:DEFAULT.SER"
+#define DEFAULT_SERIAL_DRIVER "D:BOBVERT.SER"
+
+/* Whether or not to ring the bell on receiving private message */
+#define UIFLAG_MSGBELL 0x8000
+
+/* Whether or not to show [PING,PONG] */
+#define UIFLAG_SHOWPING 0x4000
+
+/* Visual bell (screen flash) instead of audible */
+#define UIFLAG_VBELL 0x2000
+
+/* Hide (don't display) the server MOTD */
+#define UIFLAG_HIDEMOTD 0x1000
+
+/* Disable bells entirely */
+#define UIFLAG_NOBELL 0x0800
+
+/* Auto-away when ATRACT mode kicks in */
+#define UIFLAG_ATRACT_AWAY 0x400
+
+
+/* ATASCII characters */
+#define A_EOL 0x9b
+#define A_TAB 0x7f
+#define A_BS 0x7e
+#define A_CLR 0x7d
+#define A_BEL 0xfd
+#define A_DEL 0x9c
+
+/* plain ASCII characters */
+#define NL 0x0a
+#define CR 0x0d
+#define TAB 0x09
+
+/* cc65's rs232.h doesn't define this for Atari: */
+#ifndef RS_BAUD_19200
+#define RS_BAUD_19200 0x0f
+#endif
+
+#endif
diff --git a/src/fujiconf.c b/src/fujiconf.c
new file mode 100644
index 0000000..f77f2a9
--- /dev/null
+++ b/src/fujiconf.c
@@ -0,0 +1,359 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <rs232.h>
+#include <errno.h>
+#include <peekpoke.h>
+#include "uip.h"
+#include "uiplib.h"
+#include "fujichat.h"
+#include "common.h"
+
+/* TODO: move these to an external file or otherwise come up with a way
+ to reuse the memory */
+#define SERVER_LIST_LEN (sizeof(servers) / sizeof(servers[0]))
+static char *servers[][2] = {
+ /*
+ { "82.165.139.95", "irc.tobug.net (US)" },
+ { "63.243.153.235", "irc.carterroadband.com (US)" },
+ { "209.133.9.109", "ircd.eyearesee.org (US)" },
+ { "89.238.135.210", "london.eyearesee.org (EU)" },
+ { "193.23.141.104", "hungary.eyearesee.org (EU)" },
+ */
+ { "na.newnet.net", "NewNet (North America)" },
+ { "eu.newnet.net", "NewNet (Europe)" },
+ { "us.undernet.org", "Undernet (US)" },
+ { "eu.undernet.org", "Undernet (Europe)" },
+ { "irc.freenode.org", "FreeNode" },
+ { "kubrick.freenode.net", "FreeNode (US)" },
+ { "irc.efnet.org", "Eris Free Net" },
+ { "82.165.139.95", "irc.tobug.net (NewNet, US)" },
+};
+
+// char rs232_already_loaded = 0;
+
+int baud_values[] = { 1200, 2400, 4800, 9600, 19200 };
+char baud_bytes[] = { RS_BAUD_1200, RS_BAUD_2400, RS_BAUD_4800, RS_BAUD_9600, RS_BAUD_19200 };
+char max_baud = sizeof(baud_bytes);
+
+static void get_conf_color(char *name, char *color, char dflt);
+static char get_yesno(char *prompt, char dflt);
+void save_config(void);
+
+static void bell() {
+ putchar(A_BEL);
+}
+
+static void get_baudrate(void) {
+ char i, buf[5];
+
+ putchar('\n');
+ for(i=0; i<max_baud; ++i)
+ if(config->baud == baud_bytes[i])
+ printf("[%d] %d\n", i+1, baud_values[i]);
+ else
+ printf(" %d. %d\n", i+1, baud_values[i]);
+
+ fputs("\nBaud rate: ", stdout);
+ fflush(stdout);
+
+ do {
+ get_line(buf, 4);
+ if(!*buf)
+ return;
+
+ i = atoi(buf);
+ } while (i < 1 || i > max_baud);
+ config->baud = baud_bytes[--i];
+}
+
+static void get_ip_addr(char *prompt, char *dflt, uip_ipaddr_t *addr) {
+ char ok;
+ char buf[HOSTLEN+1];
+
+ do {
+ printf("%s IP address [%s]: ", prompt, dflt);
+ fflush(stdout);
+ get_line(buf, HOSTLEN);
+ if(!*buf) strcpy(buf, dflt);
+ ok = uiplib_ipaddrconv(buf, (unsigned char*)addr);
+ if(!ok) bell();
+ } while(!ok);
+}
+
+#if 0
+char scan_hatabs(char dev) {
+ int entry;
+
+ /* 0x031A is HATABS from OS equates */
+ for(entry = 0x031A; entry < 0x033F; entry += 3)
+ if(PEEK(entry) == dev) return 1;
+
+ return 0;
+}
+
+int copy_file(char *dst, char *src) {
+ // THIS FUNCTION IS BROKEN!
+ static char buf[256];
+ int i;
+ FILE *from, *to;
+
+ if( !(from = fopen(src, "rb")) ) {
+ perror(src);
+ i = errno;
+ goto done;
+ }
+
+ if( !(to = fopen(dst, "wb")) ) {
+ perror(dst);
+ i = errno;
+ goto done;
+ }
+
+ while( (i = fread(buf, 1, 256, from)) )
+ fwrite(buf, 1, i, to);
+
+ if(feof(from))
+ i = 0;
+ else
+ i = errno;
+
+done:
+ if(from) fclose(from);
+ if(to) fclose(to);
+ return i;
+}
+#endif
+
+static void config_menu(void) {
+ char i, buf[HOSTLEN+1], ok = 0;
+ unsigned int new_value;
+
+ // strcpy(config->signature, CONF_SIGNATURE);
+ ((char *)config->signature)[0] = CONF_SIGNATURE_LO;
+ ((char *)config->signature)[1] = CONF_SIGNATURE_HI;
+ config->version = CONF_VERSION;
+
+ if(!config_is_valid())
+ set_default_config();
+
+ do {
+ puts("\n==> Serial Port Settings\n");
+
+ if(get_yesno("Change RS232 driver", 0)) {
+ atari_exec("D:MAKEAUTO.COM");
+ }
+
+ get_baudrate();
+
+ /* TODO: choose which Rn: device to use (e.g. on the 850),
+ turn HW flow control on/off (buried in cc65 rs232 lib code) */
+
+ puts("\n==> Network Settings\n");
+ get_ip_addr("Local", format_ip(&(config->local_ip)), &(config->local_ip));
+ get_ip_addr("Peer", format_ip(&(config->peer_ip)), &(config->peer_ip));
+ get_ip_addr("DNS Server", format_ip(&(config->resolver_ip)), &(config->resolver_ip));
+
+ puts("\n==> IRC Settings\n");
+ puts("Server list:");
+ for(i=0; i<SERVER_LIST_LEN; ++i) {
+ printf("%d: %s\n %s\n",
+ i + 1,
+ servers[i][0],
+ servers[i][1]);
+ }
+
+ printf("\nEnter # or any server host/IP [%s]: ", config->server);
+ fflush(stdout);
+ fgets(buf, HOSTLEN, stdin);
+
+ if(*buf != '\n') {
+ if(buf[0] >= '1' && buf[0] <= (SERVER_LIST_LEN + '0') && buf[1] == '\n') {
+ strcpy(buf, servers[buf[0] - '1'][0]);
+ }
+
+ for(i=0; buf[i] && (buf[i] != '\n'); ++i)
+ ;
+
+ buf[i] = '\0';
+ strcpy(config->server, buf);
+ }
+
+ printf("Server port [%d]: ", config->server_port);
+ get_line(buf, 10);
+ new_value = atoi(buf);
+ if(new_value) config->server_port = new_value;
+
+ printf("Your nickname [%s]: ", config->nick);
+ get_line(buf, NICKLEN);
+ if(*buf) strcpy(config->nick, buf);
+
+ printf("Your 'real' name [%s]: ", config->real_name);
+ get_line(buf, NICKLEN);
+ if(*buf) strcpy(config->real_name, buf);
+
+ do {
+ printf("Autojoin channel (or 0 for none)\n[%s]: ", config->channel);
+ get_line(buf, NICKLEN);
+
+ switch(*buf) {
+ case '\0':
+ ok = 1;
+ break;
+
+ case '#':
+ case '&':
+ strcpy(config->channel, buf);
+ ok = 1;
+ break;
+
+ case '0':
+ *(config->channel) = '\0';
+ ok = 1;
+ break;
+
+ default:
+ // user-friendly:
+ *(config->channel) = '#';
+ strcpy((config->channel) + 1, buf);
+ ok = 1;
+ break;
+
+ // user-hostile:
+ /*
+ puts("IRC channel names must begin with # or &");
+ bell();
+ ok = 0;
+ */
+ }
+
+ /* TODO: scan for illegal chars, set ok=0 */
+ } while(!ok);
+
+
+ puts("\n==> User Interface Settings\n");
+ do {
+ get_conf_color("Background", &(config->bg_color), config->bg_color);
+ get_conf_color("Foreground", &(config->fg_color), config->fg_color);
+ ok = ((config->bg_color & 0x0e) != (config->fg_color & 0x0e));
+ if(!ok)
+ puts("These colors would make your text\n"
+ "impossible to see. Try again.\n");
+ } while(!ok);
+
+ new_value =
+ (get_yesno("Disable bell", config->ui_flags & UIFLAG_NOBELL) ? UIFLAG_NOBELL : 0);
+
+ if(!(new_value & UIFLAG_NOBELL)) {
+ new_value |=
+ (get_yesno("Visual bell", config->ui_flags & UIFLAG_VBELL) ? UIFLAG_VBELL : 0);
+
+ new_value |=
+ (get_yesno("Bell on msg", config->ui_flags & UIFLAG_MSGBELL) ? UIFLAG_MSGBELL : 0);
+ };
+
+ new_value |=
+ (get_yesno("Show ping/pong", config->ui_flags & UIFLAG_SHOWPING) ? UIFLAG_SHOWPING : 0);
+
+ new_value |=
+ (get_yesno("Hide MOTD", config->ui_flags & UIFLAG_HIDEMOTD) ? UIFLAG_HIDEMOTD : 0);
+
+ config->ui_flags = new_value;
+
+ puts("\n==> Config complete\n");
+ ok = get_yesno("Is this correct", 1);
+ } while(!ok);
+
+ if(get_yesno("Save this config", 1))
+ save_config();
+
+ putchar('\n');
+}
+
+void save_config(void) {
+ FILE *f = fopen(DEFAULT_CONF_FILE, "wb");
+ if(f) {
+ fwrite(config, sizeof(fuji_conf_t), 1, f);
+ fclose(f);
+ puts("Config saved to " DEFAULT_CONF_FILE);
+ }
+}
+
+static void get_conf_color(char *name, char *color, char dflt) {
+ char buf[5];
+
+ printf("%s color [%d]: ", name, dflt);
+ fgets(buf, 5, stdin);
+
+ if(!(*buf >= '0' && *buf <= '9'))
+ *color = dflt;
+ else
+ *color = atoi(buf);
+}
+
+static char get_yesno(char *prompt, char dflt) {
+ char buf[5];
+
+ printf("%s [%c/%c]: ",
+ prompt,
+ (dflt ? 'Y' : 'y'),
+ (dflt ? 'n' : 'N'));
+
+ fflush(stdout);
+ get_line(buf, 4);
+ switch(*buf) {
+ case 'y':
+ case 'Y':
+ return 1;
+
+ case 'n':
+ case 'N':
+ return 0;
+
+ default:
+ return dflt;
+ }
+}
+
+void reboot(void) {
+ asm("jmp $e477");
+}
+
+void main(void) {
+ char *next_file, buf[2];
+ int ret;
+
+ disable_break();
+
+ putchar(125);
+ puts(BANNER " Setup\n");
+ get_config();
+
+ if(!config_is_valid())
+ set_default_config();
+
+ config_menu();
+
+ /*
+ if(rs232_already_loaded) {
+ puts("\nAn RS232 driver is already resident.\n"
+ "You must reboot to use the new driver.\n");
+ if(get_yesno("Reboot now", 1))
+ reboot();
+ }
+ */
+
+ if(get_yesno("Start FujiChat now", 1)) {
+ // next_file = IRC_LOADER_FILENAME;
+ next_file = IRC_FILENAME;
+ } else {
+ next_file = MENU_FILENAME;
+ }
+
+ printf("\nLoading %s...\n", next_file);
+ ret = atari_exec(next_file);
+
+ printf("Error %d!\n\xfd", ret);
+ puts("Press Enter to exit to DOS");
+ get_line(buf, 2);
+}
diff --git a/src/fujimenu.c b/src/fujimenu.c
new file mode 100644
index 0000000..29c9d7d
--- /dev/null
+++ b/src/fujimenu.c
@@ -0,0 +1,90 @@
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include "fujichat.h"
+#include "common.h"
+
+/* TODO:
+ - rewrite in asm
+*/
+
+void run_prog(char *file) {
+ int c;
+ printf("\nLoading %s...\n", file);
+ c = atari_exec(file);
+ printf("Error %d!\n\xfd", c);
+}
+
+void main(void) {
+ int c, have_conf;
+
+ disable_break();
+
+ puts("\x7d" BANNER " Main Menu\n");
+
+ have_conf = get_config();
+ if(!have_conf)
+ set_default_config();
+
+ while(1) {
+ printf("\n %cbout\n", 'A' | 0x80);
+
+ printf("%s%cetup\n",
+ (have_conf ? " " : "* "),
+ 'S' | 0x80);
+
+ printf("%s%chat\n",
+ (have_conf ? "* " : " "),
+ 'C' | 0x80);
+
+ printf(" %cOS\n", 'D' | 0x80);
+
+ putchar('\n');
+ putchar('>');
+
+ cursor(1);
+ c = cgetc();
+ if(c == A_EOL || c == ' ')
+ c = (have_conf ? 'C' : 'S');
+
+ putchar(c | 0x80);
+
+ switch(c) {
+ case 'A':
+ case 'a':
+ run_prog("D:ABOUT.COM");
+ break;
+
+ case 'S':
+ case 's':
+ run_prog(SETUP_FILENAME);
+ break;
+
+ case 'C':
+ case 'c':
+ run_prog(IRC_FILENAME);
+ // run_prog(IRC_LOADER_FILENAME);
+ break;
+
+ /*
+ if(config_is_valid()) {
+ // atari_exec(IRC_LOADER_FILENAME);
+ atari_exec(IRC_FILENAME);
+ return 0;
+ } else {
+ putchar(A_BS);
+ puts("\nYou must run Setup first");
+ break;
+ }
+ */
+
+ case 'D':
+ case 'd':
+ return;
+
+ default:
+ putchar(A_BS);
+ break;
+ }
+ }
+}
diff --git a/src/fujiput.s b/src/fujiput.s
new file mode 100644
index 0000000..21a4969
--- /dev/null
+++ b/src/fujiput.s
@@ -0,0 +1,21 @@
+ .fopt compiler,"cc65 v 2.12.9"
+ .setcpu "6502"
+ .smart on
+ .autoimport on
+ .case on
+ .debuginfo off
+ .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
+ .macpack longbranch
+ .export _fuji_putchar
+
+.segment "CODE"
+_fuji_putchar:
+ tax
+ ;lda $E407 ; don't use ROM, might be running COL80
+ lda $0347 ; grab from IOCB 0 instead
+ pha
+ ;lda $E406
+ lda $0346
+ pha
+ txa
+ rts
diff --git a/src/fujitest.atr b/src/fujitest.atr
new file mode 100644
index 0000000..7157856
--- /dev/null
+++ b/src/fujitest.atr
Binary files differ
diff --git a/src/getsmess.c b/src/getsmess.c
new file mode 100644
index 0000000..1a8494b
--- /dev/null
+++ b/src/getsmess.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <peekpoke.h>
+
+
+void getlnasm(char *buf, char len) {
+ asm("ldy #$00");
+ asm("lda (sp),y");
+ asm("sta $e2");
+
+ asm("ldy #$02");
+ asm("jsr ldaxysp");
+ asm("sta $e0");
+ asm("stx $e0+1");
+
+ asm("@loop: lda _stdin");
+ asm("ldx _stdin+1");
+ asm("jsr _fgetc");
+
+ asm("cmp #$9B");
+ asm("beq @out");
+
+ asm("ldy #$00");
+ asm("sta ($e0),y");
+ asm("inc $e0");
+ asm("bne @noinc");
+ asm("inc $e0+1");
+ asm("@noinc:");
+
+ asm("dec $e2");
+ asm("bne @loop");
+
+ asm("@out:");
+ asm("ldy #$00");
+ asm("tya");
+ asm("sta ($e0),y");
+}
+
+void getln(char *buf, char len) {
+ char *p = buf;
+
+ do {
+ *p = fgetc(stdin);
+ if(*p == '\n') break;
+ } while(++p, --len);
+ *p = '\0';
+}
+
+void main(void) {
+ char buf[100] = "HELLO";
+ while(1) {
+ /*
+ puts("gets");
+ gets(buf);
+ puts(buf);
+ puts("fgets");
+ fgets(buf, 99, stdin);
+ puts(buf);
+ puts("getln");
+ getln(buf, 99);
+ puts(buf);
+ */
+ puts("getlnasm");
+ getlnasm(buf, 99);
+ puts(buf);
+ }
+}
diff --git a/src/hex2inc.pl b/src/hex2inc.pl
new file mode 100644
index 0000000..047438d
--- /dev/null
+++ b/src/hex2inc.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+
+$|++;
+
+while(<>) {
+ chomp;
+ my ($c, $data) = split /:/;
+ $c = hex($c);
+ next unless $c >= 32 && $c <= 127;
+
+ my @data = ($data =~ /(..)/g);
+ die "invalid data" unless @data == 6;
+ my $last = pop @data;
+ die "bottom row not blank: $last" if $last ne "00";
+
+ $glyphs[$c] = \@data;
+}
+
+$idx = 0;
+for(my $c = 32; $c < 128; $c += 2) {
+ print " byte ";
+ $bits = "";
+ for(my $byte = 0; $byte < 5; ++$byte) {
+ printf '$%02X', hex($glyphs[$c][$byte]) | (hex($glyphs[$c+1][$byte]) >> 4);
+ print ", " unless $byte == 4;
+ $bits .= sprintf "%08b\n", hex($glyphs[$c][$byte]) | (hex($glyphs[$c+1][$byte]) >> 4);
+ }
+ print " ; [$idx] $c," . ($c+1) . " " . chr($c) . "," . chr($c+1) . "\n";
+# print STDERR $bits;
+ $idx += 5;
+}
diff --git a/src/irc_notes b/src/irc_notes
new file mode 100644
index 0000000..11006f0
--- /dev/null
+++ b/src/irc_notes
@@ -0,0 +1,95 @@
+connect to server, wait a second... NICK $nick
+USER dammit dammit irc.newnet.net :dammit
+JOIN #channel
+PRIVMSG #channel Hello world!
+
+At any time, if you get a PING $whatever, respond with PONG $whatever
+
+For now just dump everything to stdout, raw. Later we can be nice and format
+stuff like a real IRC client would...
+
+Need a custom DL, 24 lines of GR.0, set up correctly for the OS to print
+and scroll, etc, then one blank scanline and one more line of GR.0. Whatever
+the user types on the bottom line there gets displayed but not sent to
+the server until the user presses Return. If joined to a channel, there
+should be a prompt with the channel name, and any text typed should get
+sent as PRIVMSG #$channel $text. If no channel, don't send to server.
+Whether on a channel or not, user can use /commands. Minimal set we
+want to support:
+
+/nick $newnick
+/join #$channel
+/part
+/quit <$quitmsg>
+/msg $user $text
+/whois
+
+For now, only one channel can be joined. PRIVMSG's from other users, and
+server messages, etc, will be displayed mixed with channel text.
+
+Actually, the DL should maybe have an additional GR.0 status line at
+the top. This will be 26 lines... or we can have the 2nd line have a LMS
+pointing 40 bytes past the "real" location of the OS's screen RAM, meaning
+the OS will print & scroll the top line, but it won't actually be displayed.
+Eventually the whole thing has to be done with a custom screen handler,
+for performance reasons.
+
+/nick $nick
+
+Send "NICK $nick" to server
+
+If you send NICK $nick and get back a 433, that's "nick already in use",
+pick a different nick & try again. The USER command won't succeed until
+the initial NICK is established (nor will any JOINs, etc)
+
+/join $channel
+
+Send "JOIN $channel" to server. The user has to type the # (which might
+be some other character for some kinds of channels). Only one channel is
+supported for now.
+
+/part - send "PART $channel" to server ($channel is from the previous
+/join command)
+
+/quit <$quitmsg>
+
+With a message, send "QUIT :$quitmsg", otherwise just send "QUIT"
+
+/msg $user $test - send "PRIVMSG $user :$text" (should also allow /m)
+
+/whois $nick - send "WHOIS $nick"
+
+For normal channel text, send "PRIVMSG $channel :$text"
+
+Incoming text, need to translate EOLs and tabs... and strip color codes,
+handle ^AACTION, translate or ignore other unprintables in ATASCII,
+particularly { } ~ chars. Nicks need everything after the ! removed.
+A PRIVMSG to the current channel also needs everything up to and
+including "PRIVMSG $channel :" removed.
+
+The biggest problem right now: the code assumes each line of text from
+the IRC server (terminated with \n) will arrive in its own packet. This
+is often the case, but not always. What needs to happen is that there
+should be an output line buffer. The buffer starts empty, and as packets
+come in, they should be scanned for \n's and put into the buffer... when
+we hit a \n char, print (or format/parse) the output buffer, clear it,
+and start scanning again. If we hit end-of-packet, don't do anything with
+the buffer. Next packet, we'll start appending to the old buffer until we
+hit \n again. This will allow us to respond to PING requests even when
+they get split across packets. The buffer will probably be 1K in size,
+we need to handle overflow conditions in a sane way (maybe just pretend
+we got a \n and print/clear the buffer).
+
+actions:
+
+Send:
+PRIVMSG #chan :^AACTION does an action^A
+
+Receive:
+:nick PRIVMSG #chan ^AACTION does an action^A
+
+pings:
+
+Receive:
+
+:nick PRIVMSG nick ^APING <stuff>^A
diff --git a/src/keybuf.h b/src/keybuf.h
new file mode 100644
index 0000000..1430ef4
--- /dev/null
+++ b/src/keybuf.h
@@ -0,0 +1,26 @@
+
+/* Dead simple keyboard buffer mechanism
+
+ Call keybuf_init() at startup
+
+ During busy loops, periodically call keybuf_poll_kbd(),
+ which will buffer keystrokes as they're pressed.
+
+ When ready to read the keyboard, call keybuf_cgetc()
+ Return value is 0 for no key pressed and no keys in buffer,
+ or else the ASCII code of the next key.
+
+ Also, can call keybuf_is_empty() to find out whether the
+ buffer's got anything in it.
+
+ It would be possible to have the OS periodically call
+ keybuf_poll_kbd() for us, using one of the countdown timers.
+ For now, not going to do this, as it adds complexity and
+ fujichat only has 2 or 3 places that count as busy
+ loops.
+ */
+
+void __fastcall__ keybuf_init(void);
+void __fastcall__ keybuf_poll_kbd(void);
+char __fastcall__ keybuf_is_empty(void);
+char __fastcall__ keybuf_cgetc(void);
diff --git a/src/keybuf.s b/src/keybuf.s
new file mode 100644
index 0000000..cf24e77
--- /dev/null
+++ b/src/keybuf.s
@@ -0,0 +1,94 @@
+ .fopt compiler,"cc65 v 2.12.9"
+ .setcpu "6502"
+ .smart on
+ .autoimport on
+ .case on
+ .debuginfo off
+ .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
+ .export _keybuf_init, _keybuf_poll_kbd, _keybuf_cgetc
+
+NO_KEY = $FF
+max_buf_len = 12 ; aka buffer size
+
+BUFFER_BASE = $F0
+
+keybuf_head = BUFFER_BASE
+keybuf_tail = BUFFER_BASE+1
+keybuf = BUFFER_BASE+2
+keybuf_end = keybuf + max_buf_len
+
+CH = $02FC
+
+ .segment "CODE"
+
+; void __fastcall__ keybuf_init(void)
+_keybuf_init:
+ lda #keybuf
+ sta keybuf_head
+ sta keybuf_tail
+ rts
+
+; void __fastcall__ keybuf_poll_kbd(void)
+_keybuf_poll_kbd:
+ lda CH
+ cmp #NO_KEY
+ beq kbpoll_done
+
+ ; got a key, see if room in buffer
+ ldx keybuf_tail
+ cpx #keybuf_end+1
+ bcs kbpoll_done
+
+ ; buffer not full, so store key in buffer
+ sta 0,x
+ inc keybuf_tail
+
+ ; clear keyboard register
+ lda #NO_KEY
+ sta CH
+
+kbpoll_done:
+ rts
+
+
+; char __fastcall__ keybuf_is_empty(void)
+_keybuf_is_empty:
+ ldx #0
+ sec
+ lda keybuf_tail
+ sbc keybuf_head
+ rts
+
+
+; char __fastcall__ keybuf_cgetc(void)
+
+; Note: 0 means "no key pressed", which means we
+; can't return character code 0 (not a big deal).
+; If this is a problem, we could change the return
+; type to int, and return -1 instead.
+
+_keybuf_cgetc:
+ ldx keybuf_head
+ cpx keybuf_tail
+ beq check_ch
+
+ ; got a key, stuff it in CH
+ lda 0,x
+ sta CH
+ inc keybuf_head
+
+call_cgetc:
+ ; ...and return the ASCII code
+ jmp _fuji_cgetc
+
+check_ch:
+ jsr _keybuf_init
+
+ ldx CH
+ cpx #NO_KEY
+ bne call_cgetc
+
+ inx ; was $FF, now 0
+ txa ; aka return(0)
+ rts
+
diff --git a/src/keybuftest.c b/src/keybuftest.c
new file mode 100644
index 0000000..4ea7f12
--- /dev/null
+++ b/src/keybuftest.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <peekpoke.h>
+#include <conio.h>
+
+#include "keybuf.h"
+
+#define RTCLOK 0x14
+
+void read_input(void) {
+ char got[20];
+ char c, *p = got;
+
+ while( (c = keybuf_cgetc()) )
+ putchar(c);
+
+ // *p++ = c;
+
+ /*
+ *p = '\0';
+
+ if(p != got)
+ fputs(got, stdout);
+ */
+}
+
+void process(void) {
+ POKE(RTCLOK, 0);
+ while(PEEK(RTCLOK) < 30) {
+ keybuf_poll_kbd();
+ }
+}
+
+void idle(void) {
+ char c;
+ POKE(RTCLOK, 0);
+ while(PEEK(RTCLOK) < 30) {
+ if( (c = keybuf_cgetc()) )
+ putchar(c);
+ }
+}
+
+void main(void) {
+ cursor(1);
+ keybuf_init();
+
+ while(1) {
+ process();
+ read_input();
+ idle();
+ }
+}
diff --git a/src/loadchat.dasm b/src/loadchat.dasm
new file mode 100644
index 0000000..c63ed41
--- /dev/null
+++ b/src/loadchat.dasm
@@ -0,0 +1,54 @@
+
+; If no R: driver is loaded, load DEFAULT.SER
+; Then, load FujiChat
+
+; This is needed because e.g. Bob-verter loads at $5000, smack in the
+; middle of FujiChat's code. This tiny little loader program should be
+; small enough and out-of-the-way enough that nothing will stomp on it.
+
+ processor 6502
+ include "equates.inc"
+
+atari_exec = $0600
+main = $2E00 ; same place as cc65
+
+; segment header
+ org main-6
+ word $FFFF
+ word main
+ word endmain-1
+
+ org main
+
+; search handler table for R entry
+ ldx #0
+tabloop:
+ lda HATABS,x
+ cmp #'R
+ beq load_chat
+ inx
+ inx
+ inx
+ cpx #$24 ; 12 entries * 3 bytes = 36
+ bne tabloop
+
+; no R: driver found, load one
+ lda #<driver_filename
+ ldx #>driver_filename
+ jsr atari_exec
+
+; load main fujichat program (does not return)
+; (in fact it better not return, it overwrites this program!)
+load_chat:
+ lda #<chat_filename
+ ldx #>chat_filename
+ jmp atari_exec
+
+driver_filename .byte "D:DEFAULT.SER", 0
+chat_filename .byte "D:FUJICHAT.COM", 0
+endmain
+
+; segment header
+ word RUNAD
+ word RUNAD+1
+ word main
diff --git a/src/loadmenu.dasm b/src/loadmenu.dasm
new file mode 100644
index 0000000..71cbdfc
--- /dev/null
+++ b/src/loadmenu.dasm
@@ -0,0 +1,69 @@
+
+; Load MENU.COM
+
+; This will be part of AUTORUN.SYS on the disk. Without it,
+; I'd have to make AUTORUN.SYS a copy of MENU.COM :(
+
+ processor 6502
+ include "equates.inc"
+
+atari_exec = $0600
+main = $2E00 ; same place as cc65
+
+; segment header
+ org main-6
+ word $FFFF
+ word main
+ word endmain-1
+
+ org main
+
+; do this so pressing Reset give us DOS
+; ldx #1
+; stx BOOTQ
+; dex
+; stx COLDST
+
+; remove later: see if FujiChat can work with only 44K
+;; lda #$B0
+;; sta RAMTOP
+;; lda #12 ; CIO CLOSE
+;; sta ICCOM
+;; ldx #0
+;; jsr CIOV
+;;
+;;
+;; lda #3 ; Command 3=OPEN
+;; sta ICCOM
+;; lda #12 ; 12=R/W access
+;; sta ICAX1
+;; lda #0
+;; sta ICAX2
+;; lda #<e_dev ; E: device
+;; sta ICBAL
+;; lda #>e_dev
+;; sta ICBAH
+;; lda #e_dev_len
+;; sta ICBLL
+;; lda #0
+;; tax
+;; sta ICBLH
+;; jsr CIOV ; call CIO
+
+
+; our raison d'etre...
+ lda #<menu_filename
+ ldx #>menu_filename
+ jmp atari_exec
+
+menu_filename .byte "D:FUJIMENU.COM", 0
+
+e_dev byte "E:",0
+e_dev_len equ *-e_dev+1
+
+endmain
+
+; segment header
+ word RUNAD
+ word RUNAD+1
+ word main
diff --git a/src/loadmkau.dasm b/src/loadmkau.dasm
new file mode 100644
index 0000000..613be44
--- /dev/null
+++ b/src/loadmkau.dasm
@@ -0,0 +1,69 @@
+
+; Load MENU.COM
+
+; This will be part of AUTORUN.SYS on the disk. Without it,
+; I'd have to make AUTORUN.SYS a copy of MENU.COM :(
+
+ processor 6502
+ include "equates.inc"
+
+atari_exec = $0600
+main = $2E00 ; same place as cc65
+
+; segment header
+ org main-6
+ word $FFFF
+ word main
+ word endmain-1
+
+ org main
+
+; do this so pressing Reset give us DOS
+; ldx #1
+; stx BOOTQ
+; dex
+; stx COLDST
+
+; remove later: see if FujiChat can work with only 44K
+;; lda #$B0
+;; sta RAMTOP
+;; lda #12 ; CIO CLOSE
+;; sta ICCOM
+;; ldx #0
+;; jsr CIOV
+;;
+;;
+;; lda #3 ; Command 3=OPEN
+;; sta ICCOM
+;; lda #12 ; 12=R/W access
+;; sta ICAX1
+;; lda #0
+;; sta ICAX2
+;; lda #<e_dev ; E: device
+;; sta ICBAL
+;; lda #>e_dev
+;; sta ICBAH
+;; lda #e_dev_len
+;; sta ICBLL
+;; lda #0
+;; tax
+;; sta ICBLH
+;; jsr CIOV ; call CIO
+
+
+; our raison d'etre...
+ lda #<menu_filename
+ ldx #>menu_filename
+ jmp atari_exec
+
+menu_filename .byte "D:MAKEAUTO.COM", 0
+
+e_dev byte "E:",0
+e_dev_len equ *-e_dev+1
+
+endmain
+
+; segment header
+ word RUNAD
+ word RUNAD+1
+ word main
diff --git a/src/loadtest.c b/src/loadtest.c
new file mode 100644
index 0000000..cf56627
--- /dev/null
+++ b/src/loadtest.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+void __fastcall__ (*atari_exec_p)(char *) = (void __fastcall__ (*)(char *))0x600;
+#define atari_exec(x) ((*atari_exec_p)(x))
+
+int main(int, char **) {
+ puts("Loading D:RVERT.COM");
+ atari_exec("D:RVERT.COM");
+ puts("Loading D:FUJICHAT.RAW");
+ atari_exec("D:FUJICHAT.RAW");
+ puts("Should never get here!");
+}
diff --git a/src/logcomptest.pl b/src/logcomptest.pl
new file mode 100644
index 0000000..6285f93
--- /dev/null
+++ b/src/logcomptest.pl
@@ -0,0 +1,229 @@
+#!/usr/bin/perl -w
+
+# sample session for IRC log compression scheme
+
+$lastnick = "";
+$textlen = 0;
+while(<DATA>) {
+ $lines++;
+ $bigtot += length($_);
+ chomp;
+
+ my ($nick, $text) = split " ", $_, 2;
+ for($nick, $text) {
+ s/(.)$/chr(ord($1)|0x80)/e;
+ }
+
+ if(($nick ne $lastnick) || ($textlen + length($text) > 256)) {
+ $output .= $nick;
+ $output .= $text;
+ $lastnick = $nick;
+ $textlen = length($text);
+ } else {
+ $output .= chr(1) . $text;
+ $textlen += length($text);
+ }
+}
+
+print "lines: $lines\n";
+print "old: $bigtot\n";
+print "new: " . length($output) . "\n";
+print "saved: " . ($bigtot - length($output)) . "\n";
+print "compression: " . (1.0 - (length($output) / $bigtot)) . "\n";
+
+print STDERR $output;
+
+__DATA__
+Slor WIDE?
+Slor dunno
+Redbeard I've seen a 29w7 though.
+SteveS who you calling WIDE?
+DogWombl i'm not wide, i'm just badly out of proportion
+Redbeard Was labeled "video" on the back of a Intergraph machine, back when they had their own unix running on a custom cpu.
+Slor where'd urch go, anyway?
+Slor ask a question and disappear
+SteveS he said he had real work
+SteveS be back late, late
+BeetlePC hey SteveSI have two 10base2 NICs but I don't need transceivers and I definitely don't want any of those fat ass transceiver cables.
+SteveS beetle, how is the 1080 coming?
+SteveS bah. I'm going through BSG withdrawal!
+Redbeard Transcievers would allow you to put a 10base5 nic onto the same coax network. Or sometimes rackmount switches have a (is it db15?) connector on them.
+Slor someone tell me this too - what is a "Modem Eliminator"? Is that just fancy for null modem?
+SteveS group shrug
+BeetlePC i didn't work on it lately
+SteveS grrr. I still can't figure why my MyIDE movie audio player is not playing nice.
+SteveS I will order parts for SDrive this week. I will. I will. I will.
+Redbeard q
+SteveS been saying that for a while now
+BeetlePC good, good, good
+BeetlePC :)
+Slor doesn't buy it
+SteveS $7 seems too much for a SD connector though. I might try the floppy cable connector hack on the first try.
+BeetlePC you can also cannibalize a dead/cheap SD card reader
+SteveS don't have one
+ChrisTOS nn
+BeetlePC night
+SteveS nite
+SteveS christos
+ChrisTOS q
+Slor didn't even see him talk today
+SteveS I need to get a working one though
+atarixle q
+SteveS I didn't know atarixle was here
+SteveS Would ask him if there is an English version of the new Boss X.
+BeetlePC he told you
+SteveS people need better names, btw. XL Boss, Boss XL, and Boss X.
+BeetlePC 10.4 will be available in german and english
+SteveS oh!
+SteveS I missed the answer.
+SteveS I thought he ignored me
+BeetlePC i remembered it :)
+SteveS my mistake. sorry.
+BeetlePC np
+BeetlePC gets himself a beer
+BeetlePC cheers
+SteveS has no beer in the house and is not going out in 19 degree weather to get some.
+SteveS cheers
+SteveS holds up his empty tea mug
+BeetlePC :)
+BeetlePC *pling*
+BeetlePC i scored an IBM thinkpad T42 on ebay today
+BeetlePC its for my dad
+SteveS Zum Wohl to dad
+BeetlePC 1.6 GHz Pentium M, 1 Gig of RAM and a new 160GB HD, plus a new IBM battery (used laptop batterys are most often dead)
+BeetlePC should do for his mobile computing needs
+SteveS :)
+BeetlePC He is some 'car accident expert' i don't know how that job is called in english. He views damaged cars and estimates the cost of repairs. He also reconstructs what happend during the crash.
+BeetlePC How the crash happend
+BeetlePC happened
+SteveS Adjuster?
+SteveS Insurance Adjuster, is what we call them.
+BeetlePC hmm
+BeetlePC he does not work for an insurance
+SteveS oh
+BeetlePC one-man-company
+BeetlePC he is the boss of himself :)
+BeetlePC and also the best boy
+SteveS I don't think we have a single equivalent for that job.
+BeetlePC Kfz-Sachverständiger
+BeetlePC lets see what google says
+BeetlePC car expert :-/
+SteveS oops when I cut and pasted into babel fish I got my Atari font
+SteveS Kfz-Sachverständiger
+SteveS looks Ok here
+SteveS Atari Extrasmooth
+BeetlePC well, he looks at the damaged car, writes down every harmed component and calculates the time to repair it.
+SteveS in babel fish
+BeetlePC and for this job, a laptop would be nice
+SteveS estimates are performed by a representative of your insurance company here.
+BeetlePC thats common here, too
+SteveS also called Claims Adjuster
+BeetlePC but the job has not to be done by someone from the insurance
+BeetlePC you are allowed to choose here
+SteveS some insurance companines allow you to call to a service shop or even several service shops.
+BeetlePC and a 'independend claims adjuster' might get a larger payment form the insurance of your opponent than his insurances representant
+BeetlePC from -from
+BeetlePC because he doesn't get payed for keeping costs small for the insurance
+SteveS Some insurance companies won't even pay for original parts
+BeetlePC because of that, if your car gets damaged by someone, you are allowed to choose who will examine you car
+rrCurtisP j
+SteveS My friend bought a Mini Cooper
+SteveS a new one
+BeetlePC wow, nice
+SteveS I think he is a having a mid-life crisis. Normally a very conservative person.
+SteveS I always wanted a Porshe 356
+BeetlePC well, if a car he likes helps - better than leaviing wife and kids as a neighour here does
+SteveS ouch
+BeetlePC fuse blown - i have no other explanation
+SteveS 20 yr-old GF maybe
+BeetlePC no - or he does hide it well
+BeetlePC :)
+charliec j
+charliec good evening all
+BeetlePC hey charliec
+charliec Hiya Beetle
+Harlock q
+SteveS hey charliec
+charliec Hi Steve
+SteveS charliie, did I remember to send you MyDOS 3.19?
+charliec Nope
+SteveS It has the RS232 driver for ATR8000
+charliec didnt know if you caught that..
+SteveS sorry
+charliec dont be
+SteveS dcc in just a second
+charliec hold.. im on fuji
+SteveS oh
+SteveS that won't work
+SteveS not yet
+charliec not yet huh
+cc_PC j
+cc_PC okee
+cc_PC ready when you are
+Harlock j
+cc_PC Thanks!
+SteveS welcome
+SteveS you will be asked to build a version of DOS. It does it in memory the you must select 'H', Save DOS files.
+cc_PC Ok
+charliec ever run CP/M on the ATR Steve?
+Moloch j
+charliec well heading to a surprise b-day party, cant be late for those!
+charliec nute
+charliec heh.. nite
+charliec q
+cc_PC q
+BeetlePC good night
+BeetlePC q
+fres j
+fres hey, all.
+fres and by all I mean, uh... who?
+Slor yo
+SteveS oops. I fell asleep
+Slor heh
+SteveS hi fres
+SteveS Hot cocoa! BRB...
+fres fellas...
+Harlock q
+Harlock j
+SteveS _FujIRC time to backup MyIDE
+SteveS _FujIRC q
+SteveS damn, it's quiet in here
+DogWombl it seems to be quiet in irc channels everywhere
+Harlock everyone but us out on friday night
+Moloch q
+SteveS _FujIRC j
+SteveS _FujIRC back
+SteveS wb
+rrCurtisP q
+Woodzy q
+DocRotCod j
+SteveS _FujIRC q
+Velcro_MM q
+Velcro_MM j
+fres nope
+SteveS yup yup yup
+SteveS nothing to see here
+SteveS Anyone have to travel for Thanksgiving?
+SteveS Not me.
+DocRotCod q
+Urchlay Redb3ard and JellE are driving to Indiana
+SteveS oh, is Red from there?
+Urchlay think he's from Virginia, but got family there
+Redb3ard Grew up in Indiana, only place I'd ever been until I was 18.
+Urchlay my grandma (like 88 this year) was going to come up this year
+Redb3ard I just happened to be in Virginia, when we started talking.
+Urchlay ah
+Urchlay grandma can't drive for 4 hours straight (er, way she drives it'd take 8 anyway)
+Urchlay the other day my aunt who was gonna do the driving, fell & broke her hip
+Urchlay so no aunt, no grandma, no cool cousin
+Urchlay (well, maybe cool cousin, she lives in Riverdale IIRC)
+SteveS ouch. well, I wish your aunt a fast recovery.
+Urchlay the doc says she's doing great
+Urchlay I really don't think of her as *old* but she's in her 60s now I guess
+Urchlay (if I ask, she'll say she's still 59 I'm sure)
+Urchlay wish I had the car, I'd drive down there
+Urchlay go see her in the hospital, bring a fake can of peanuts with a snake in it
+Urchlay (a fake one!)
+Urchlay eh, sorry, the snake thing is like a 20-year running gag I guess
+SteveS um
+SteveS ok
diff --git a/src/logtest.c b/src/logtest.c
new file mode 100644
index 0000000..4a22cb4
--- /dev/null
+++ b/src/logtest.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* 0x100 * 32 = 8K (but we likely won't get that much) */
+#define LOG_PAGE_SIZE 0x20
+#define LOG_MAX_PAGES 16
+#define LOG_SCROLL_PAGES 2
+
+static char *log_buffer = NULL;
+static char *log_buf_end = NULL;
+static char *log_buf_current = NULL;
+static int log_pages = LOG_MAX_PAGES;
+
+// static char last_log_nick[NICKLEN + 1];
+
+static void alloc_log_buffer() {
+ log_buffer = malloc(LOG_PAGE_SIZE * log_pages);
+ log_buf_end = (char *)(log_buffer + log_pages * LOG_PAGE_SIZE - 1);
+ log_buf_end[1] = 0xaa;
+ log_buf_current = log_buffer;
+}
+
+static void log_msg(char *msg) {
+ int len = strlen(msg);
+ if( (log_buf_current + len + 1) > log_buf_end ) {
+ memmove(log_buffer, log_buffer + (LOG_SCROLL_PAGES * LOG_PAGE_SIZE), (log_pages - LOG_SCROLL_PAGES) * LOG_PAGE_SIZE);
+ log_buf_current -= (LOG_SCROLL_PAGES * LOG_PAGE_SIZE);
+ }
+
+ memcpy(log_buf_current, msg, len);
+ log_buf_current += (len + 1);
+ *log_buf_current = '\0';
+}
+
+static void dump_log_stats(void) {
+ printf("start: %x, end: %x, cur: %x\n", log_buffer, log_buf_end, log_buf_current);
+}
+
+void main(void) {
+ char buf[100];
+ int i;
+
+ alloc_log_buffer();
+ dump_log_stats();
+
+ for(i=0; i<24; i++) {
+ sprintf(buf, ":--------------------Iteration #%d\n", i);
+ log_msg(buf);
+ dump_log_stats();
+ }
+HANG: goto HANG;
+}
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..2e5ee17
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,1184 @@
+/*
+ * Copyright (c) 2008, Brian Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgements:
+ * This product includes software developed by Adam Dunkels.
+ * This product includes software developed by Brian Watson.
+ * 4. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the FujiChat IRC client.
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <atari.h>
+#include "uip.h"
+#include "uiplib.h"
+#include "rs232dev.h"
+#include <conio.h>
+#include <peekpoke.h>
+#include <string.h>
+#include <ctype.h>
+#include <rs232.h>
+
+#include "timer.h"
+
+#ifndef NULL
+#define NULL (void *)0
+#endif /* NULL */
+
+/* Program name (plain ASCII for network use) */
+#define SELF "FujiChat"
+/* inverse video version, used for local prompts: */
+#define SELF_INV "\xc6\xf5\xea\xe9\xc3\xe8\xe1\xf4"
+
+#define VERSION "0.3.1"
+#define BANNER SELF_INV " v" VERSION
+#define VERSION_REPLY SELF " v" VERSION
+
+
+#define DEFAULT_NICK SELF
+
+#define CONF_SIGNATURE "\x03\x0e"
+#define CONF_VERSION 4
+#define DEFAULT_CONF_FILE "FUJICHAT.CFG"
+
+/* TODO: move the non-IRC-related config to a separate SETUP program,
+ and a separate UIP.CFG file. This will be shared by all apps that
+ use uIP, such as the planned telnet and FTP clients. Also it means
+ we don't have to bloat each program with a complete config UI
+ for things like the local/peer/DNS IP addresses.
+
+ In fact the SETUP utility might resolve IP addresses for us, so
+ each app might not need its own copy of the resolver... though
+ that's maybe a bit clumsy to use for FTP, since you generally want
+ to easily be able to connect to arbitrary servers (unlike, say, IRC
+ where you usually use the same server all the time). Perhaps SETUP
+ could resolve arbitrary hostnames, then write them to a /etc/hosts
+ type of file. Parsing /etc/hosts entries is fairly lightweight,
+ could be done in all the client programs...
+
+ ...or maybe what should happen is that there should be a RESOLV
+ program that can resolve hostnames, and read/write them in text
+ form to a HOSTS.TXT file... and also parses the HOSTS file and
+ stores the hostname strings and 4-byte IP addresses in a fixed
+ area of memory. The app programs could just look up hostnames in
+ this memory area, without having to open & parse HOSTS themselves.
+ cc65 programs by default start at $2E00. The Bob-verter driver ends
+ around $2200 (other R: drivers should be comparable), which gives
+ us around 3K of unallocated memory. Assuming the average hostname/IP
+ pair is 50 bytes, that'd give us about 60 of them. The RESOLV program
+ would stop the user from adding more hostnames when there's no space
+ for them (and let them delete some to make room, maybe commenting them
+ out so they remain in the HOSTS file for future uncommenting).
+
+ Ultimately there should be a master AUTORUN.SYS file with a menu
+ that runs the other sub-apps (or lets you exit to DUP). Menu would
+ have options like "DNS", "IRC", "FTP", "Telnet", and "Network
+ Setup". Of course I need to write a program loader, there's no
+ exec* functions in cc65! The Network Setup option would let you
+ specify the R: driver you want to load, so it wouldn't have to
+ be prepended to any of the executables, and would be auto-loaded
+ the first time you try to run any of the apps that need it. It'd
+ be nice if the main menu program had at least a few DOS functions
+ as well (delete/copy/rename/lock/unlock, format too?)
+
+ Probably, FujiChat's 1.0 release will be as a standalone IRC client,
+ with the current config UI stuff as-is. The other stuff would be
+ released months from now, under the label "FujiNet" or something, and
+ include a new version of FujiChat as one of several apps.
+
+ The final distibution disk will need at least some documentation in
+ Atari-readable text format, plus a doc-reader program.
+
+ All the subprograms need to end with RTS to the menu program, which
+ shold be small and stay resident in addresses not touched by cc65
+ (I've got 128 bytes each in the cassette buffer and page 5, also
+ 256 more in page 6. Should be easy to squeeze into 512 bytes, no?)
+
+ So a disk directory would contain:
+
+ DOS.SYS, DUP.SYS
+ AUTORUN.SYS - the main menu and subprogram loader
+ BOBVERT.XEX - the Bob-verter R: driver
+ A850.XEX - the 850 R: driver (from DOS 2.0S I guess)
+ MIO.XEX, BLACKBOX.XEX, etc, drivers for other serial ports
+ HOSTS.TXT - the /etc/hosts file, human-readable and -editable
+ README.TXT - docs
+ MORE.XEX - doc reader (should handle ASCII or ATASCII EOLs)
+ SETUP.XEX - set up global network settings (local/remote/dns IPs, also
+ things like screen colors, key-repeat rate, etc).
+ DNS.XEX - lookup hostnames, maintain and parse HOSTS.TXT
+ FTP.XEX, TELNET.XEX, IRC.XEX, PING.XEX - the apps
+ FTP.CFG, TELNET.CFG, IRC.CFG, etc - app-specific settings
+ FUJINET.CFG - global settings
+ ...if there's room on the disk, a small text editor might be nice
+ to include.
+
+ The whole thing should be distributed as a bootable, single-density
+ DOS disk (undecided which DOS, either 2.0S or MyDOS 4.5).
+
+ Alternatively, all the XEX files might be named COM, and the whole
+ thing could run under a CLI DOS like Sparta (if it'll actually
+ run). The apps could take optional CLI arguments, also... and the
+ AUTORUN.SYS would actually be unnecessary!
+
+ */
+
+#define BUF_SIZE 256
+#define OUTBUF_SIZE 768
+#define NICKLEN 20
+#define HOSTLEN 64
+
+/* fuji_conf_t is stored in the config file verbatim.
+ Don't forget to update CONF_VERSION when changing this struct!
+ Also, the first member should never, ever change, and the 2nd
+ (version) should only ever be set to CONF_VERSION (which can be
+ changed)
+
+ TODO:
+ char alt_nick[NICKLEN+1];
+ */
+typedef struct {
+ char signature[2];
+ u16_t version;
+
+ /* uIP settings: */
+ uip_ipaddr_t local_ip;
+ uip_ipaddr_t peer_ip;
+ uip_ipaddr_t resolver_ip;
+ char baud;
+
+ /* IRC settings: */
+ char server[HOSTLEN+1];
+ u16_t server_port;
+ char nick[NICKLEN+1];
+ char real_name[NICKLEN+1];
+ char channel[NICKLEN+1];
+
+ /* UI settings: */
+ char bg_color;
+ char fg_color;
+ u16_t ui_flags; /* bitwise OR of UIFLAG_* constants */
+} fuji_conf_t;
+
+fuji_conf_t config;
+
+/* Whether or not to ring the bell on receiving private message */
+#define UIFLAG_MSGBELL 0x8000
+
+/* Whether or not to show [PING,PONG] */
+#define UIFLAG_SHOWPING 0x4000
+
+/* Visual bell (screen flash) instead of audible */
+#define UIFLAG_VBELL 0x2000
+
+/* Hide (don't display) the server MOTD */
+/* TODO: implement */
+#define UIFLAG_HIDEMOTD 0x1000
+
+/* Disable bells entirely */
+#define UIFLAG_NOBELL 0x0800
+
+char os_version[10] = "XL_XE";
+char channel[BUF_SIZE];
+char input_buf[BUF_SIZE];
+char chan_msg_buf[BUF_SIZE * 2];
+char output_buf[OUTBUF_SIZE + 1];
+char last_msg_nick[NICKLEN+1] = "";
+
+int input_buf_len = 0;
+int output_buf_len = 0;
+
+char config_valid = 0;
+char done = 0;
+char connected = 0;
+char joined_channel = 0; /* true if we're in a channel */
+char nick_registered = 0;
+char vbell_active = 0;
+
+static void get_line(char *buf, unsigned char len);
+static void handle_keystroke(void);
+static void handle_command(void);
+static void get_config(void);
+static void config_menu(void);
+static void send_server_cmd(char *cmd, char *arg);
+static void bell();
+void redraw_user_buffer();
+
+/* ATASCII characters */
+#define A_EOL 0x9b
+#define A_TAB 0x7f
+#define A_BS 0x7e
+#define A_CLR 0x7d
+#define A_BEL 0xfd
+#define A_DEL 0x9c
+
+/* plain ASCII characters */
+#define NL 0x0a
+#define CR 0x0d
+#define TAB 0x09
+
+/* TODO: move these to an external file or otherwise come up with a way
+ to reuse the memory */
+#define SERVER_LIST_LEN 8
+static char *servers[][2] = {
+ /*
+ { "82.165.139.95", "irc.tobug.net (US)" },
+ { "63.243.153.235", "irc.carterroadband.com (US)" },
+ { "209.133.9.109", "ircd.eyearesee.org (US)" },
+ { "89.238.135.210", "london.eyearesee.org (EU)" },
+ { "193.23.141.104", "hungary.eyearesee.org (EU)" },
+ */
+ { "na.newnet.net", "NewNet (North America)" },
+ { "eu.newnet.net", "NewNet (Europe)" },
+ { "us.undernet.org", "Undernet (US)" },
+ { "eu.undernet.org", "Undernet (Europe)" },
+ { "irc.freenode.org", "FreeNode" },
+ { "kubrick.freenode.net", "FreeNode (US)" },
+ { "irc.efnet.org", "Eris Free Net" },
+ { "82.165.139.95", "irc.tobug.net (NewNet, US)" },
+};
+
+/* uIP API stuff */
+struct timer nick_reg_timer; /* ../uip/timer.h */
+struct timer vbell_timer;
+struct telnet_state *tstate; /* ../apps/telnet.h */
+
+/*---------------------------------------------------------------------------*/
+int main(void) {
+ char c;
+ int i;
+ uip_ipaddr_t ipaddr;
+ struct timer periodic_timer;
+ char cmdbuf[HOSTLEN+1];
+
+ c = get_ostype() & AT_OS_TYPE_MAIN;
+ if(c == AT_OS_400800) {
+ strcpy(os_version, "800");
+ } else if(c == AT_OS_1200XL) {
+ strcpy(os_version, "1200XL");
+ }
+
+ cursor(1); /* don't let conio hide the cursor */
+
+ /* set screen colors to white-on-black initially. They may be
+ reset by the user's config file, once it's loaded */
+ POKE(710, 0);
+ POKE(709, 12);
+
+ putchar(A_CLR);
+ puts(BANNER);
+ putchar('\n');
+
+ get_config();
+
+ while(1) {
+ done = 0;
+ rs232dev_close();
+
+ POKE(710, config.bg_color);
+ POKE(709, config.fg_color);
+
+ printf("Server name/IP, [C]onfig, or e[X]it\n");
+ printf("[%s]: ", config.server);
+ fflush(stdout);
+ get_line(cmdbuf, HOSTLEN);
+
+ if(strcasecmp(cmdbuf, "x") == 0) {
+ exit(0);
+ } else if(strcasecmp(cmdbuf, "c") == 0) {
+ config_menu();
+ continue;
+ } else if(*cmdbuf) {
+ strcpy(config.server, cmdbuf);
+ }
+ /* else, use the existing config.server */
+
+ timer_set(&periodic_timer, CLOCK_SECOND / 2);
+
+ rs232dev_init(config.baud);
+ uip_init();
+
+ uip_sethostaddr(config.local_ip);
+ uip_setdraddr(config.peer_ip);
+
+ /* can I use 255.255.255.252 here? Does it matter? */
+ uip_ipaddr(ipaddr, 255,255,255,0);
+ uip_setnetmask(ipaddr);
+
+ if(uiplib_ipaddrconv(config.server, (unsigned char*)&ipaddr)) {
+ (void)uip_connect(&ipaddr, htons(config.server_port));
+ } else {
+ resolv_init();
+ resolv_conf(config.resolver_ip);
+ resolv_query(config.server);
+ }
+
+ while(!done) {
+ /* This part of the while loop is straight from the no-ARP example
+ code, from the uIP docs. */
+ uip_len = rs232dev_poll();
+ if(uip_len > 0) {
+ uip_input();
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ } else if(timer_expired(&periodic_timer)) {
+ timer_reset(&periodic_timer);
+ for(i = 0; i < UIP_CONNS; i++) {
+ uip_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+
+#if UIP_UDP
+ for(i = 0; i < UIP_UDP_CONNS; i++) {
+ uip_udp_periodic(i);
+ /* If the above function invocation resulted in data that
+ should be sent out on the network, the global variable
+ uip_len is set to a value > 0. */
+ if(uip_len > 0) {
+ rs232dev_send();
+ }
+ }
+#endif /* UIP_UDP */
+ }
+
+ if(vbell_active && timer_expired(&vbell_timer)) {
+ POKE(710, config.bg_color);
+ vbell_active = 0;
+ }
+
+ /* Call the keyboard handler if the user pressed a key. Note that
+ we're using stdio for printing, but conio for reading, which
+ works on the Atari but may not work on all other cc65 platforms */
+ if(kbhit()) {
+ handle_keystroke();
+ }
+
+ /* Automatically register the nick and userhost after being
+ connected for a couple seconds. The parameters for the USER
+ command are ignored by the server (at least the NewNet servers) */
+ if(connected && !nick_registered && timer_expired(&nick_reg_timer)) {
+ puts("Registering nick");
+ sprintf(input_buf, "NICK %s%cUSER %s %s %s :%s%c",
+ config.nick, NL, config.nick, SELF,
+ config.server, config.real_name, NL);
+ telnet_send(tstate, input_buf, strlen(input_buf));
+ input_buf_len = 0;
+ nick_registered = 1;
+ /* TODO: check for failure registering the nick */
+ }
+
+ /*
+ if(PEEK(53279) == 6) { // START pressed
+ puts("Disconnecting");
+ uip_close();
+ // done = 1;
+ }
+ */
+ }
+
+ connected = nick_registered = joined_channel = 0;
+ }
+ return 0;
+}
+
+static void bell() {
+ if(config.ui_flags & UIFLAG_NOBELL)
+ return;
+
+ if(config.ui_flags & UIFLAG_VBELL) {
+ vbell_active = 1;
+ timer_set(&vbell_timer, CLOCK_SECOND / 10);
+ POKE(710, config.bg_color + 8);
+ } else {
+ putchar(A_BEL);
+ }
+}
+
+/* The err_* functions will probably support "visual bell" (screen flashing)
+ as an option one day. */
+static void err_missing_arg(void) {
+ puts("Command requires argument");
+ bell();
+}
+
+static void err_no_channel(void) {
+ puts("You are not in a channel (use /join #channel)");
+ bell();
+}
+
+static void err_already_joined(void) {
+ puts("You are already in a channel (use /part to leave)");
+ bell();
+}
+
+static void del_last_word(void) {
+ int old = input_buf_len, bs = 0;
+
+ while(input_buf_len && input_buf[input_buf_len] == ' ') {
+ ++bs;
+ input_buf_len--;
+ }
+
+ while(input_buf_len && input_buf[input_buf_len] != ' ') {
+ ++bs;
+ input_buf_len--;
+ }
+
+ if(old > 120 && input_buf_len <= 120) {
+ putchar(0x1c);
+ putchar(A_DEL);
+ putchar(A_DEL);
+ redraw_user_buffer();
+ } else do {
+ putchar(A_BS);
+ } while(--bs);
+}
+
+/* Keyboard handler. For now, the keyboard macros are hard-coded. */
+static void handle_keystroke(void) {
+ char i, c, send_buf = 0;
+
+ /* TODO:
+ ctrl-7 = ` (warning: cgetc() can't read this)
+ ctrl-, = {
+ ctrl-. = }
+ ctrl-; = ~ (don't do ctrl-^, that's left-arrow!)
+
+ Ignore inverse-video key, ATASCII graphics, unwanted
+ cursor actions, make caps-lock stop freezing the program.
+ To do this right, we have to examine location 764 for some
+ of these, and don't call cgetc() at all... or actually,
+ stuff a valid keycode there, then call cgetc() to make a
+ keyclick noise (but ignore its return value)
+
+ Make Break act like delete-line
+
+ */
+ c = cgetc();
+
+ /* Keyboard macros, only allowed at the start of a new line */
+ if(input_buf_len == 0) {
+ switch(c) {
+ case 0x0e: /* ctrl-N */
+ if(joined_channel) send_server_cmd("NAMES", channel);
+ return;
+
+ case 0x17: /* ctrl-W */
+ if(joined_channel) send_server_cmd("WHO", channel);
+ return;
+
+ case A_EOL:
+ return; /* ignore Return on a line by itself */
+
+ case A_TAB:
+ if(last_msg_nick[0]) {
+ sprintf(input_buf, "/msg %s ", last_msg_nick);
+ input_buf_len = strlen(input_buf);
+ for(i=0; i<input_buf_len; i++)
+ putchar(input_buf[i] | 0x80);
+ }
+ return;
+
+ default:
+ break;
+ }
+ }
+
+ /* Editing keys */
+ /* TODO: more editing keys. At minimum:
+ left/right arrows
+ ^W = delete last word
+ ^U = kill to start of line
+ ^K = kill to end of line
+ ^A = goto start of line
+ ^E = goto end of line
+ ^L = redraw input buffer
+ */
+ if(c == A_BS) { /* backspace */
+ if(input_buf_len > 0) {
+ input_buf_len--;
+ putchar(c);
+ } else {
+ bell();
+ }
+
+ return;
+ } else if(c == A_DEL || c == 0x15) {
+ /* shift-backspace or ^U (delete line) */
+ input_buf_len = 0;
+ putchar(A_DEL);
+ return;
+ } else if(c == 0x17) {
+ /* ^W (delete word) */
+ del_last_word();
+ return;
+ }
+
+ /* Echo keystroke */
+ putchar(c | 0x80); /* inverse video for now */
+
+ if(c == A_EOL) {
+ c = NL;
+ send_buf = 1;
+ } else if(c == A_TAB) {
+ c = TAB;
+ }
+
+ /* Store keystroke in input buffer */
+ input_buf[input_buf_len++] = c;
+
+ /* If line too long, ring the "margin" bell */
+ if(input_buf_len > BUF_SIZE - 1)
+ if(!send_buf) {
+ bell();
+ putchar(A_BS);
+ input_buf_len--;
+ }
+
+ /* If we've got a complete line of input and user has pressed Return,
+ send it to the server */
+ if(send_buf) {
+ input_buf[input_buf_len] = '\0';
+
+ if(*input_buf == '/') {
+ handle_command();
+ } else if(joined_channel) {
+ sprintf(chan_msg_buf, "PRIVMSG %s :%s", channel, input_buf);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+ } else {
+ err_no_channel();
+ }
+
+ input_buf_len = 0;
+ }
+}
+
+static void send_server_cmd(char *cmd, char *arg) {
+ if(arg) {
+ sprintf(chan_msg_buf, "%s %s%c", cmd, arg, NL);
+ } else {
+ sprintf(chan_msg_buf, "%s%c", cmd, NL);
+ }
+
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+}
+
+static void send_ctcp_version(char *arg) {
+ sprintf(chan_msg_buf, "PRIVMSG %s %cVERSION%c%c",
+ arg, 1, 1, NL);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+}
+
+static void send_ctcp_ping(char *arg) {
+ sprintf(chan_msg_buf, "PRIVMSG %s %cPING %c%c",
+ arg, 1, 1, NL);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+}
+
+static void do_me(char *arg) { /* Do me, baby! */
+ sprintf(chan_msg_buf, "PRIVMSG %s :%cACTION %s%c%c",
+ channel, 1, arg, 1, NL);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+}
+
+static void handle_command(void) {
+ char *cmd = input_buf + 1, *cend;
+ char *arg = NULL, *p = cmd;
+
+ /* convert command word to uppercase */
+ while((*p != NL) && (*p != ' ')) {
+ *p = toupper(*p);
+ ++p;
+ }
+
+ cend = p;
+
+ /* set arg pointer, nul-terminate arg, if present */
+ /* (otherwise, arg remains NULL) */
+ if(*p != NL) {
+ arg = p;
+ /* skip extra whitespace */
+ while(*arg == ' ')
+ ++arg;
+ p = arg + 1;
+ while(*p && (*p != NL))
+ ++p;
+ *p = '\0';
+ }
+
+ /* nul-terminate cmd */
+ *cend = '\0';
+
+ /* See if it's a command that needs client-side help */
+ if(strcmp(cmd, "ME") == 0) {
+ if(!joined_channel)
+ err_no_channel();
+ else if(!arg)
+ err_missing_arg();
+ else
+ do_me(arg);
+ } else if(strcmp(cmd, "MSG") == 0 || strcmp(cmd, "M") == 0) {
+ if(!arg)
+ err_missing_arg();
+ else
+ send_server_cmd("PRIVMSG", arg);
+ } else if(strcmp(cmd, "JOIN") == 0 || strcmp(cmd, "J") == 0) {
+ if(joined_channel) {
+ err_already_joined();
+ } else {
+ joined_channel = 1;
+ strcpy(channel, arg);
+ send_server_cmd("JOIN", arg);
+ }
+ } else if(strcmp(cmd, "PART") == 0) {
+ if(!joined_channel) {
+ err_no_channel();
+ } else {
+ joined_channel = 0;
+ send_server_cmd("PART", channel);
+ }
+ } else if(strcmp(cmd, "VERSION") == 0 || strcmp(cmd, "VER") == 0) {
+ if(!arg)
+ err_missing_arg();
+ else
+ send_ctcp_version(arg);
+ } else if(strcmp(cmd, "PING") == 0) {
+ if(!arg)
+ err_missing_arg();
+ else
+ send_ctcp_ping(arg);
+ } else if(strcmp(cmd, "QUOTE") == 0) {
+ if(!arg)
+ err_missing_arg();
+ else
+ send_server_cmd(arg, NULL);
+ } else {
+ /* Anything we don't recognize as a client command, we pass
+ directly to the server. */
+ send_server_cmd(cmd, arg);
+ }
+}
+
+/* The telnet_* functions are uIP application callbacks. */
+void telnet_connected(struct telnet_state *s) {
+ /* puts("Connected to host, press START to disconnect"); */
+ puts("Connected to server");
+ tstate = s;
+ s->text = NULL;
+ s->textlen = 0;
+ timer_set(&nick_reg_timer, CLOCK_SECOND);
+ connected = 1;
+}
+
+void telnet_closed(struct telnet_state *s) {
+ puts("Connection closed");
+ uip_close();
+ done = 1;
+}
+
+void telnet_sent(struct telnet_state *s) {
+}
+
+void telnet_aborted(struct telnet_state *s) {
+ puts("Connection aborted");
+ uip_abort();
+ done = 1;
+}
+
+void telnet_timedout(struct telnet_state *s) {
+ puts("Connection timed out");
+ uip_abort();
+ done = 1;
+}
+
+void do_pong() {
+ char *p = chan_msg_buf;
+
+ memcpy(chan_msg_buf, output_buf, output_buf_len);
+ chan_msg_buf[1] = 'O';
+ while(*p) {
+ if(*p == A_EOL) *p = NL;
+ p++;
+ }
+
+ telnet_send(tstate, chan_msg_buf, output_buf_len);
+ if(config.ui_flags & UIFLAG_SHOWPING)
+ puts("[PING,PONG]");
+}
+
+/* Handler for text received from the server, responsible for
+ formatting. TODO: part/join/quit aren't handled correctly. */
+void do_msg() {
+ char *nick = output_buf, *cmd = output_buf, *chan = NULL, *msg = NULL;
+ char *bang = NULL;
+
+ while(*cmd != ' ') {
+ if(*cmd == '!') {
+ bang = cmd;
+ }
+ ++cmd;
+ }
+
+ /* no ! in nick means a server message or something, just print as-is */
+ if(!bang) {
+ fputs(output_buf, stdout);
+ fflush(stdout);
+ return;
+ }
+
+ *cmd = '\0';
+ ++cmd;
+ chan = cmd;
+
+ while(*chan != ' ')
+ ++chan;
+ *chan = '\0';
+ ++chan;
+ msg = chan;
+
+ if(*msg != A_EOL) {
+ while(*msg && *msg != ' ')
+ ++msg;
+ if(*msg) {
+ *msg = '\0';
+ ++msg;
+ if(*msg == ':') ++msg;
+ }
+ }
+
+ /* FIXME: This stuff is hairy, unmaintainable, and probably just wrong
+ (works OK with the 2 or 3 NewNet servers I test with, not tried
+ others). It's the result of too much coffee, and needs to be
+ redesigned. Heck, it needs to be designed in the first place! */
+ if(strcmp(cmd, "PRIVMSG") == 0) {
+ nick[0] = '<';
+ bang[0] = '>';
+ bang[1] = '\0';
+ if(strcasecmp(chan, config.nick) != 0) {
+ // privmsg, not to our nick, must be channel text
+ if(memcmp(msg, "\x01" "ACTION ", 8) == 0) {
+ nick++;
+ *bang = '\0';
+ output_buf[output_buf_len - 2] = A_EOL;
+ output_buf[output_buf_len - 1] = '\0';
+ printf("* %s %s", nick, msg + 8);
+ } else {
+ printf("%s %s", nick, msg);
+ }
+ } else {
+ // privmsg, is to our nick
+ if(memcmp(msg, "\x01" "PING ", 6) == 0) {
+ nick++;
+ *bang = '\0';
+ output_buf[output_buf_len - 2] = '\0';
+ sprintf(chan_msg_buf, "NOTICE %s :\x01PING %s\x01%c",
+ nick, msg + 6, 0x0a);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+ printf("* CTCP PING from %s\n", nick);
+ } else if(memcmp(msg, "\x01" "VERSION\x01", 9) == 0) {
+ nick++;
+ *bang = '\0';
+ sprintf(chan_msg_buf, "NOTICE %s :\x01VERSION "
+ VERSION_REPLY " - running on "
+ "an Atari %s\x01%c",
+ nick, os_version, 0x0a);
+ telnet_send(tstate, chan_msg_buf, strlen(chan_msg_buf));
+ printf("* CTCP VERSION from %s\n", nick);
+ } else {
+ printf("MSG: %s %s", nick, msg);
+ if(config.ui_flags & UIFLAG_MSGBELL)
+ bell();
+ *bang = '\0';
+ strcpy(last_msg_nick, nick + 1);
+ }
+ }
+ } else {
+ if(*msg) {
+ printf("%s %s %s %s", nick, cmd, chan, msg);
+ } else {
+ printf("%s %s %s", nick, cmd, chan);
+ }
+ }
+
+ fflush(stdout);
+}
+
+void del_user_buffer() {
+ /* delete user edit buffer */
+ if(input_buf_len) {
+ putchar(A_DEL);
+ if(input_buf_len > 119) {
+ putchar(0x1c); /* up arrow */
+ putchar(A_DEL);
+ }
+ }
+}
+
+void redraw_user_buffer() {
+ int tlen;
+ static char redraw_buf[BUF_SIZE];
+ /* reprint user edit buffer */
+ if(input_buf_len) {
+ tlen = input_buf_len - 1;
+ do {
+ redraw_buf[tlen] = input_buf[tlen] | 0x80;
+ } while(tlen--);
+ redraw_buf[input_buf_len] = '\0';
+ fputs(redraw_buf, stdout);
+ fflush(stdout);
+ }
+}
+
+/* Another uIP app callback. This decides whether or not we've received
+ a complete message from the server (which may be split into multiple
+ packets, and may end in the middle of a packet) */
+void telnet_newdata(struct telnet_state *s, char *data, u16_t len) {
+ u16_t tlen = len;
+ char c, *t = data, buf_done = 0;
+
+ while(tlen-- != 0) {
+ c = *t++;
+ if(c == NL) { // swallow NL
+ continue;
+ } else if(c == CR) { // CR => EOL
+ c = A_EOL;
+ buf_done = 1;
+ } else if(c == TAB) { // tab
+ c = A_TAB;
+ } else if(c == '{') {
+ c = '[' | 0x80;
+ } else if(c == '}') {
+ c = ']' | 0x80;
+ } else if(c == '~') {
+ c = '^' | 0x80;
+ } else if(c == 0x60) { // backtick
+ c = 0xa7; // inverse quote
+ }
+
+ output_buf[output_buf_len++] = c;
+ if(output_buf_len >= OUTBUF_SIZE - 1) {
+ puts("[buffer overflow]\xfd");
+ buf_done = 1;
+ break;
+ }
+
+ if(buf_done) {
+ del_user_buffer();
+ output_buf[output_buf_len] = '\0';
+
+ if(output_buf_len > 4 && (memcmp(output_buf, "PING", 4) == 0)) {
+ do_pong();
+ } else if(output_buf[0] == ':') {
+ do_msg();
+ } else {
+ fputs(output_buf, stdout);
+ fflush(stdout);
+ }
+
+ redraw_user_buffer();
+ output_buf_len = 0;
+ buf_done = 0;
+ }
+ }
+}
+
+/* Load config file, offer the user a chance to change the config */
+static void get_config(void) {
+ // char filename[20];
+ FILE *f = fopen(DEFAULT_CONF_FILE, "rb");
+
+ puts("Loading config from " DEFAULT_CONF_FILE);
+
+ if(f) {
+ config_valid =
+ fread(&config, 1, sizeof(fuji_conf_t), f) == sizeof(fuji_conf_t);
+ fclose(f);
+ if(!config_valid)
+ puts("Config file is wrong size");
+ } else {
+ puts("No config file found");
+ }
+
+ if(config_valid) {
+ if(memcmp(config.signature, CONF_SIGNATURE, 2) != 0) {
+ puts("Not a valid config file");
+ config_valid = 0;
+ } else if(config.version != CONF_VERSION) {
+ puts("Config is for the wrong version of FujiChat, ignoring");
+ config_valid = 0;
+ } else {
+ puts("Loaded OK");
+ /*
+ printf("Loaded OK. Use defaults [Y/n]? ");
+ fflush(stdout);
+ fgets(input_buf, 10, stdin);
+ if(*input_buf == 'N' || *input_buf == 'n')
+ config_menu();
+ */
+ }
+ }
+
+ if(!config_valid)
+ config_menu();
+}
+
+static void save_config(void) {
+ FILE *f = fopen(DEFAULT_CONF_FILE, "wb");
+ if(f) {
+ fwrite(&config, sizeof(fuji_conf_t), 1, f);
+ fclose(f);
+ puts("Config saved to " DEFAULT_CONF_FILE);
+ }
+}
+
+static void get_conf_color(char *name, char *color, char dflt) {
+ char buf[5];
+
+ printf("%s color [%d]: ", name, dflt);
+ fgets(buf, 5, stdin);
+
+ if(!(*buf >= '0' && *buf <= '9'))
+ *color = dflt;
+ else
+ *color = atoi(buf);
+}
+
+static void get_line(char *buf, unsigned char len) {
+ fgets(buf, len, stdin);
+ while(*buf) {
+ if(*buf == '\n')
+ *buf = '\0';
+ ++buf;
+ }
+}
+
+static char get_yesno(char *prompt, char dflt) {
+ char buf[5];
+
+ printf("%s [%c/%c]: ",
+ prompt,
+ (dflt ? 'Y' : 'y'),
+ (dflt ? 'n' : 'N'));
+
+ fflush(stdout);
+ get_line(buf, 4);
+ switch(*buf) {
+ case 'y':
+ case 'Y':
+ return 1;
+
+ case 'n':
+ case 'N':
+ return 0;
+
+ default:
+ return dflt;
+ }
+}
+
+static void get_ip_addr(char *prompt, char *dflt, uip_ipaddr_t *addr) {
+ char ok;
+ char buf[HOSTLEN+1];
+
+ do {
+ printf("%s IP address [%s]: ", prompt, dflt);
+ fflush(stdout);
+ get_line(buf, HOSTLEN);
+ if(!*buf) strcpy(buf, dflt);
+ ok = uiplib_ipaddrconv(buf, (unsigned char*)addr);
+ if(!ok) bell();
+ } while(!ok);
+}
+
+static char *format_ip(uip_ipaddr_t *ip) {
+ static char buf[20];
+ u16_t *ipaddr = (u16_t *)ip;
+ sprintf(buf, "%d.%d.%d.%d",
+ htons(ipaddr[0]) >> 8,
+ htons(ipaddr[0]) & 0xff,
+ htons(ipaddr[1]) >> 8,
+ htons(ipaddr[1]) & 0xff);
+ return buf;
+}
+
+void set_default_config(void) {
+ uip_ipaddr(&(config.local_ip), 192,168,0,2);
+ uip_ipaddr(&(config.peer_ip), 192,168,0,1);
+ uip_ipaddr(&(config.resolver_ip), 192,168,0,1);
+ strcpy(config.server, servers[0][0]);
+ strcpy(config.nick, DEFAULT_NICK);
+ strcpy(config.real_name, "FujiChat User");
+ config.server_port = 6667;
+ config.ui_flags = 0;
+ config.bg_color = 0xc0; /* dark green */
+ config.fg_color = 0x0c;
+ config.baud = RS_BAUD_4800;
+
+ config_valid = 1;
+}
+
+int baud_values[] = { 1200, 2400, 4800, 9600 };
+char baud_bytes[] = { RS_BAUD_1200, RS_BAUD_2400, RS_BAUD_4800, RS_BAUD_9600 };
+char max_baud = sizeof(baud_bytes);
+
+static void get_baudrate(void) {
+ char i, buf[5];
+
+ for(i=0; i<max_baud; ++i)
+ if(config.baud == baud_bytes[i])
+ printf("[%d]=%d ", i+1, baud_values[i]);
+ else
+ printf("%d=%d ", i+1, baud_values[i]);
+
+ fputs("Baud rate: ", stdout);
+ fflush(stdout);
+
+ do {
+ get_line(buf, 4);
+ if(!*buf)
+ return;
+
+ i = atoi(buf);
+ } while (i < 1 || i > max_baud);
+ config.baud = baud_bytes[--i];
+}
+
+static void config_menu(void) {
+ char i, buf[HOSTLEN+1], ok = 0;
+ unsigned int new_value;
+
+ strcpy(config.signature, CONF_SIGNATURE);
+ config.version = CONF_VERSION;
+
+ if(!config_valid)
+ set_default_config();
+
+ do {
+ get_baudrate();
+ get_ip_addr("Local", format_ip(&(config.local_ip)), &(config.local_ip));
+ get_ip_addr("Peer", format_ip(&(config.peer_ip)), &(config.peer_ip));
+ get_ip_addr("DNS Server", format_ip(&(config.resolver_ip)), &(config.resolver_ip));
+
+ puts("Server list:");
+ for(i=0; i<SERVER_LIST_LEN; ++i) {
+ printf("%d: %s\n %s\n",
+ i + 1,
+ servers[i][0],
+ servers[i][1]);
+ }
+
+ printf("\nEnter # or any server host/IP [%s]: ", config.server);
+ fflush(stdout);
+ fgets(buf, HOSTLEN, stdin);
+
+ if(buf[0] == '\n') {
+ buf[0] = '1';
+ buf[1] = '\n';
+ }
+
+ if(buf[0] >= '1' && buf[0] <= (SERVER_LIST_LEN + '0') && buf[1] == '\n') {
+ strcpy(buf, servers[buf[0] - '1'][0]);
+ }
+
+ for(i=0; buf[i] && (buf[i] != '\n'); ++i)
+ ;
+
+ buf[i] = '\0';
+ strcpy(config.server, buf);
+
+ printf("Server port [%d]: ", config.server_port);
+ get_line(buf, 10);
+ new_value = atoi(buf);
+ if(new_value) config.server_port = new_value;
+
+ printf("Your nickname [%s]: ", config.nick);
+ get_line(buf, NICKLEN);
+ if(*buf) strcpy(config.nick, buf);
+
+ printf("Your 'real' name [%s]: ", config.real_name);
+ get_line(buf, NICKLEN);
+ if(*buf) strcpy(config.real_name, buf);
+
+ // if(!*(config.nick)) strcpy(config.nick, DEFAULT_NICK);
+ /* TODO: scan for invalid chars */
+
+ get_conf_color("Background", &(config.bg_color), config.bg_color);
+ get_conf_color("Foreground", &(config.fg_color), config.fg_color);
+
+ new_value =
+ (get_yesno("Disable bell", config.ui_flags & UIFLAG_NOBELL) ? UIFLAG_NOBELL : 0);
+
+ if(!(config.ui_flags & UIFLAG_NOBELL)) {
+ new_value |=
+ (get_yesno("Visual bell", config.ui_flags & UIFLAG_VBELL) ? UIFLAG_VBELL : 0);
+
+ new_value |=
+ (get_yesno("Bell on msg", config.ui_flags & UIFLAG_MSGBELL) ? UIFLAG_MSGBELL : 0);
+ };
+
+ new_value |=
+ (get_yesno("Show ping/pong", config.ui_flags & UIFLAG_SHOWPING) ? UIFLAG_SHOWPING : 0);
+
+ config.ui_flags = new_value;
+
+ ok = get_yesno("Is this correct", 1);
+ } while(!ok);
+
+ if(get_yesno("Save this config", 1))
+ save_config();
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* uIP app callback for the resolver */
+void resolv_found(char *name, u16_t *ipaddr) {
+ if(ipaddr == NULL) {
+ printf("Host '%s' not found.\n", name);
+ done = 1;
+ } else {
+ printf("Found name '%s' = %d.%d.%d.%d\n", name,
+ htons(ipaddr[0]) >> 8,
+ htons(ipaddr[0]) & 0xff,
+ htons(ipaddr[1]) >> 8,
+ htons(ipaddr[1]) & 0xff);
+ if(!connected)
+ (void)uip_connect((uip_ipaddr_t *)ipaddr, htons(config.server_port));
+ }
+}
diff --git a/src/makeauto.c b/src/makeauto.c
new file mode 100644
index 0000000..6e8ff71
--- /dev/null
+++ b/src/makeauto.c
@@ -0,0 +1,177 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "fujichat.h"
+#include "common.h"
+#include "features.h"
+
+#define DRIVER_LIST_LEN (sizeof(rs232_drivers) / sizeof(rs232_drivers[0]))
+static char *rs232_drivers[][2] = {
+ { NULL, "(No driver; manual setup)" },
+ { "D:BOBVERT.SER", "SIO2PC or R:Verter" },
+ { "D:ATARI850.SER", "Atari 850" },
+ { "D:PRCONN.SER", "P:R: Connection" },
+};
+
+/* APPEND_BUF_SIZE should be >= the size of the largest .SER file */
+#define APPEND_BUF_SIZE 2048
+
+void reboot(void) {
+ asm("jmp $e477");
+}
+
+static char get_yesno(char *prompt, char dflt) {
+ char buf[5];
+
+ printf("%s [%c/%c]: ",
+ prompt,
+ (dflt ? 'Y' : 'y'),
+ (dflt ? 'n' : 'N'));
+
+ fflush(stdout);
+ get_line(buf, 4);
+ switch(*buf) {
+ case 'y':
+ case 'Y':
+ return 1;
+
+ case 'n':
+ case 'N':
+ return 0;
+
+ default:
+ return dflt;
+ }
+}
+
+//char append_to(FILE *to, char *src) {
+// int bytes;
+// char ret;
+// static char buf[APPEND_BUF_SIZE];
+// FILE *from = fopen(src, "rb");
+//
+// printf("append_to: %s\n", src);
+//
+// if(!from) {
+// perror(src);
+// return 0;
+// }
+//
+// while( (bytes = fread(buf, 1, APPEND_BUF_SIZE, from)) ) {
+// printf("%d bytes in, eof? %d\n", bytes, feof(from));
+// bytes = fwrite(buf, 1, bytes, to);
+// printf("%d bytes out\n", bytes);
+// }
+//
+// ret = feof(from); /* 1 = no error */
+// fclose(from);
+//
+// return ret;
+//}
+
+char append_to(FILE *to, char *src) {
+ int bytes = 0, c;
+ char ret;
+ // static char buf[APPEND_BUF_SIZE];
+ FILE *from = fopen(src, "rb");
+
+ printf("append_to: %s\n", src);
+
+ if(!from) {
+ perror(src);
+ return 0;
+ }
+
+ /* painfully slow, sorry! TODO: figure out why fread() returns
+ extra bytes after EOF (probably because the file doesn't
+ end on a sector boundary, or something equally lame) */
+ while( (c = fgetc(from)) != EOF ) {
+ fputc(c, to);
+ ++bytes;
+ }
+
+ ret = feof(from); /* 1 = no error */
+ fclose(from);
+
+ printf("bytes=%d, ret=%d\n", bytes, ret);
+ return ret;
+}
+
+char append_files(char *dst, char *src1, char *src2) {
+ char ret;
+ FILE *dfile = fopen(dst, "wb");
+
+ if(dfile) {
+ ret = (append_to(dfile, src1) && append_to(dfile, src2));
+ fclose(dfile);
+ return ret;
+ } else {
+ perror(dst);
+ return 0;
+ }
+}
+
+static void rs232_driver_menu() {
+ static char buf[256];
+ int i;
+
+ puts("Select your serial port type\n");
+ for(i=0; i<DRIVER_LIST_LEN; ++i) {
+ printf("%d: %s\n",
+ i + 1,
+ rs232_drivers[i][1]);
+ }
+
+ puts("\nEnter number from list, or the\ndriver filename if not listed.");
+ fputs("[2]: ", stdout);
+ fflush(stdout);
+
+ do {
+ i = 0;
+ get_line(buf, 255);
+
+ if(!*buf) *buf = '2';
+
+ if(*buf == '1') {
+ return;
+ } else if(*buf >= '2' && *buf <= '9') {
+ i = *buf - '1';
+ if(i < DRIVER_LIST_LEN) {
+ strcpy(buf, rs232_drivers[i][0]);
+ i = 0;
+ } else {
+ putchar(A_BEL);
+ i = 1;
+ }
+ } /* else use whatever they entered as a filename */
+ } while(i);
+
+ // if(!rename("D:AUTORUN.SYS", "D:AUTORUN.BAK")) {
+ // puts("Renamed AUTORUN.SYS to AUTORUN.BAK");
+ // }
+
+ do {
+ printf("\nCreating AUTORUN.SYS from\n%s and LOADMENU.COM\n", buf);
+ i = !append_files("D:AUTORUN.SYS", buf, "D:LOADMENU.COM");
+ if(i) {
+ i = get_yesno("\xfdRetry", 1);
+ if(!i) {
+ puts("Failed to change driver");
+ return;
+ }
+ }
+ } while(i);
+
+ puts("You must reboot to use the new driver.");
+ if(get_yesno("Reboot now", 1))
+ reboot();
+
+ // rs232_already_loaded = scan_hatabs('R');
+}
+
+void main(int, char **) {
+ rs232_driver_menu();
+ exit(0);
+}
+
diff --git a/src/mkdisk.sh b/src/mkdisk.sh
new file mode 100644
index 0000000..5da6985
--- /dev/null
+++ b/src/mkdisk.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+set -e
+
+rm -rf disk
+mkdir disk
+cp dos_20s.atr disk/fujichat.atr
+cp uip fujichat.xex
+cp atari850.ser disk/atari850.ser
+cp bobvert.com disk/bobvert.ser
+cp prconn.ser disk/prconn.ser
+
+if [ -f about.txt ]; then
+ perl -pe 's/\n/\x9b/' < about.txt > disk/about.txt
+fi
+
+cd disk
+for i in about loadmenu fujimenu makeauto fujiconf fujichat; do
+ cat ../aexec.xex ../$i.xex > $i.com
+ axe -w $i.com fujichat.atr
+done
+
+#cat ../bobvert.com fujimenu.com > autorun.sys
+#cat fujimenu.com > autorun.sys
+
+cat ../aexec.xex ../loadmkau.xex > autorun.sys
+axe -w autorun.sys fujichat.atr
+
+axe -w atari850.ser fujichat.atr
+axe -w bobvert.ser fujichat.atr
+axe -w prconn.ser fujichat.atr
+
+if [ -f about.txt ]; then
+ axe -w about.txt fujichat.atr
+fi
+
+cp fujichat.atr ..
+
+# build my own test disk so I don't have to keep going thru the
+# serial port and config every time
+if [ "`whoami`" = "urchlay" ]; then
+ cat bobvert.ser loadmenu.com > autorun.sys
+ cp ../fujichat.cfg .
+ cp fujichat.atr fujitest.atr
+ axe -w autorun.sys fujitest.atr
+ axe -w fujichat.cfg fujitest.atr
+ mv fujitest.atr ..
+fi
diff --git a/src/mkfuji64.sh b/src/mkfuji64.sh
new file mode 100644
index 0000000..88ff391
--- /dev/null
+++ b/src/mkfuji64.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cat bobvert.com col64.xex disk/fujichat.com > autorun.sys
+axe -w autorun.sys fuji80.atr
diff --git a/src/mkfuji80.sh b/src/mkfuji80.sh
new file mode 100644
index 0000000..c4b7e75
--- /dev/null
+++ b/src/mkfuji80.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cat bobvert.com col80_modified/col80_hacked.xex disk/fujichat.com > autorun.sys
+axe -w autorun.sys fuji80.atr
diff --git a/src/new_format_ip.s b/src/new_format_ip.s
new file mode 100644
index 0000000..5fab2ba
--- /dev/null
+++ b/src/new_format_ip.s
@@ -0,0 +1,54 @@
+ .fopt compiler,"cc65 v 2.12.9"
+ .setcpu "6502"
+ .smart on
+ .autoimport on
+ .case on
+ .debuginfo off
+ .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
+ .macpack longbranch
+ .export _new_format_ip
+
+ .segment "BSS"
+buf:
+ .res 20,$0
+
+ .segment "RODATA"
+fmt: .byte "%d.%d.%d.%d", 0
+
+; unsigned char* __fastcall__ format_ip (__near__ unsigned int[2]*)
+ .segment "CODE"
+_new_format_ip:
+ sta ptr1
+ stx ptr1+1
+
+ lda #<buf
+ ldx #>buf
+ jsr pushax
+
+ lda #<fmt
+ ldx #>fmt
+ jsr pushax
+
+ ldy #0
+ lda (ptr1),y
+ jsr pusha0
+
+ ldy #1
+ lda (ptr1),y
+ jsr pusha0
+
+ ldy #2
+ lda (ptr1),y
+ jsr pusha0
+
+ ldy #3
+ lda (ptr1),y
+ jsr pusha0
+
+ ldy #$0c
+ jsr _sprintf
+
+ lda #<buf
+ ldx #>buf
+
+ rts
diff --git a/src/notes.64x34 b/src/notes.64x34
new file mode 100644
index 0000000..e886760
--- /dev/null
+++ b/src/notes.64x34
@@ -0,0 +1,176 @@
+
+64x34 software text mode needs GR.8 style screen, at 320x204. This
+requires 8160 bytes for screen memory, plus (I think) 214 bytes
+for display list. The initial version will probably use the plain
+GR.8+16 display, and only support 32 rows.
+
+Character cells are 5x6, with glyphs being mostly 4x5 with a blank row
+at the bottom and blank column on the left. Probably for lowercase and
+capital M/m/W/w, I'll hard-code a bit of logic to copy the right-most
+bit into the normally-blank left-most column, so these characters will
+be fully-formed, though they'll touch the char to the left. Doing it
+this way allows packing one row of pixels from 2 different glyphs into
+each byte of glyph-definition table, like COL80 does.
+
+Depending on the design of the final font, it might also be that I can
+avoid storing the bottom row (a few characters might need it to be a
+copy of the top row, or I might get away with hard-coding zero). If
+I'm not storing the bottom row, each 2 glyphs will take up 5 bytes
+of table space (for a 128-character font, that's 320 bytes; for an
+ASCII-only 96-char font, only 240 bytes! That fits in one page, so
+I can simplify the routine that reads it). If I do store the bottom
+row, those numbers become 384 and 288 bytes, respectively. Later on
+if there's support for UTF-8 or whatever, it still might be better
+to use the 240-byte 96-char fonts, but allow for more than one of
+them.
+
+The renderer needs to be able to handle inverse video. It would also be
+nice to support underlining (just force the bottom row of each glyph to
+all 1's), but then there needs to be a way for the calling application
+to set underline mode. Also it might be hard to read... Theoretically
+it'd be possible to do italics too (shift the bottom few rows of pixels
+left), but I think it would come out too ugly to want to use.
+
+Writing a glyph to screen RAM involves a 2-byte buffer for each row of
+pixels. Extract 4-bit glyph data from glyph table, synthesize the 5th
+bit for MmWw, store in the 2-byte buffer (in top 5 bits), then calculate
+how many pixels to shift it, based on the cursor position. When actually
+writing to RAM, have to load the old data from each of the 2 bytes, mask
+off the appropriate bits, OR in the new bits, store back to RAM. This is
+kind of an expensive operation, but we're only doing it for 6 scanlines
+instead of 8 like COL80 uses, so maybe it'll be fast enough.
+
+If the right mask is $00, we don't have to touch the 2nd byte at all. The
+left mask will never be $00. (algorithm below does touch the 2nd byte though)
+
+leftbyte = int(COLCRS*5/8), easy enough to calculate, but table lookup
+will be faster. If we get tight on space, try it without the table.
+
+shift amounts will be stored in a table. Only 8 entries needed, lookup
+on COLCRS%8.
+
+; first, calculate or lookup the start address of the current
+; screen line, *SAVMSC + (*ROWCRS * 5), and store in rowptr
+; next, calculate or lookup the start address of the corrent
+; glyph, extract the relevant 4 bits (top or bottom nybble) and
+; store in glyphdata bits 2-6 (all other bits 0). Store 0 in glyphdata+1.
+; This is the body of the inner loop... rowptr needs to get 40 added to
+; it every time through the loop.
+ lda COLCRS
+ tax
+ lda left_byte_table,x
+ clc
+ adc rowptr
+ sta zptr
+ adc rowptr+1
+ sta zptr+1
+ ; (zptr) now points to left byte
+ ldy #0
+ lda (zptr),y
+ sta olddata
+ iny
+ lda (zptr),y
+ sta olddata+1
+ ; olddata holds the old screen RAM contents
+
+ lda #$07
+ sta mask
+ lda #$FF
+ sta mask+1
+
+ txa
+ and #$07 ; a%=8
+ tay
+ lda shift_amt_table,y
+ tay ; Y now holds the shift amount
+ beq no_shift
+
+shift_loop:
+ lsr glyphdata
+ ror glyphdata+1
+ sec
+ ror mask
+ ror mask+1
+ dey
+ bpl shift_loop
+
+ iny ; Y = 0
+no_shift:
+ lda olddata
+ and mask
+ ora glyphdata
+ sta (zptr),y
+ iny
+ lda olddata+1
+ and mask+1
+ ora glyphdata+1
+ sta (zptr),y
+
+To calculate screen bytes to alter... COLCRS ranges 0 to 63:
+
+COLCRS - leftbyte - shift amount - leftmask - rightmask
+0 0 0 $F8 $00
+1 0 5 $07 $C0
+2 1 2 $3E $00
+3 1 7 $01 $F0
+4 2 4 $0F $80
+5 3 1 $7C $00
+6 3 6 $03 $E0
+7 4 3 $1F $00
+8 5
+9 5
+10 6
+11 6
+12 7
+13 8
+14 8
+15 9
+16 10
+17 10
+18 11
+19 11
+20 12
+21 13
+22 13
+23 14
+24 15
+25 15
+26 16
+27 16
+28 17
+29 18
+30 18
+31 19
+32 20
+33 20
+34 21
+35 21
+36 22
+37 23
+38 23
+39 24
+40 25
+41 25
+42 26
+43 26
+44 27
+45 28
+46 28
+47 29
+48 30
+49 30
+50 31
+51 31
+52 32
+53 33
+54 33
+55 34
+56 35
+57 35
+58 36
+59 36
+60 37
+61 38
+62 38
+63 39
+
diff --git a/src/prconn.ser b/src/prconn.ser
new file mode 100644
index 0000000..8332d4e
--- /dev/null
+++ b/src/prconn.ser
Binary files differ
diff --git a/src/put.c b/src/put.c
new file mode 100644
index 0000000..7425fb3
--- /dev/null
+++ b/src/put.c
@@ -0,0 +1,12 @@
+
+void __fastcall__ fuji_putchar(char);
+
+void main(void) {
+ char msg[] = "Test\n";
+ char i;
+
+ for(i=0; i<5; ++i)
+ fuji_putchar(msg[i]);
+
+HANG: goto HANG;
+}
diff --git a/src/rs232dev.c b/src/rs232dev.c
new file mode 100644
index 0000000..9738fce
--- /dev/null
+++ b/src/rs232dev.c
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2001, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Adam Dunkels.
+ * 4. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: rs232dev.c,v 1.1 2001/11/20 20:49:45 adam Exp $
+ *
+ */
+
+/*
+ * This is a generic implementation of the SLIP protocol over an RS232
+ * (serial) device. While initially intented for the C64, the code can
+ * easily be ported to other platforms as well.
+ *
+ * Huge thanks to Ullrich von Bassewitz <uz@cc65.org> of cc65 fame for
+ * and endless supply of bugfixes, insightsful comments and
+ * suggestions, and improvements to this code!
+ */
+
+#include <rs232.h>
+#include <time.h>
+#include <string.h>
+
+ /* This will include the system specific header files as well */
+#if defined(__CBM__)
+# include <cbm.h>
+#elif defined(__ATARI__)
+# include <atari.h>
+#endif
+
+#include "uip.h"
+
+#include "features.h"
+
+#ifdef FEAT_KEYBOARD_BUFFER
+#include "keybuf.h"
+#endif
+
+#define SLIP_END 0300
+#define SLIP_ESC 0333
+#define SLIP_ESC_END 0334
+#define SLIP_ESC_ESC 0335
+
+
+#define SIO_RECV(c) while(rs232_get(&c) == RS_ERR_NO_DATA)
+#define SIO_POLL(c) (rs232_get(&c) != RS_ERR_NO_DATA)
+#define SIO_SEND(c) rs232_put(c)
+
+#define MAX_SIZE UIP_BUFSIZE
+
+static u8_t slip_buf[MAX_SIZE];
+
+#if MAX_SIZE > 255
+static u16_t len, tmplen;
+#else
+static u8_t len, tmplen;
+#endif /* MAX_SIZE > 255 */
+
+#if 0
+#define printf(x)
+#else
+#include <stdio.h>
+#endif
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+#include <peekpoke.h>
+/* FujiChat screen stuff */
+static u16_t traffic_indicator;
+static char old_char;
+
+#define DOWN_ARROW 0xdd
+#define UP_ARROW 0xdc
+
+#endif
+
+/*-----------------------------------------------------------------------------------*/
+static void rs232_err(char err) {
+ switch(err) {
+ case RS_ERR_OK:
+ // printf("RS232 OK\n");
+ break;
+ case RS_ERR_NOT_INITIALIZED:
+ printf("RS232 not initialized\n");
+ break;
+ case RS_ERR_BAUD_TOO_FAST:
+ printf("RS232 baud too fast\n");
+ break;
+ case RS_ERR_BAUD_NOT_AVAIL:
+ printf("RS232 baud rate not available\n");
+ break;
+ case RS_ERR_NO_DATA:
+ printf("RS232 nothing to read\n");
+ break;
+ case RS_ERR_OVERFLOW:
+ printf("RS232 overflow\n");
+ break;
+ }
+}
+
+/*-----------------------------------------------------------------------------------*/
+/*
+ * rs232dev_send():
+ *
+ * Sends the packet in the uip_buf and uip_appdata buffers. The first
+ * 40 bytes of the packet (the IP and TCP headers) are read from the
+ * uip_buf buffer, and the following bytes (the application data) are
+ * read from the uip_appdata buffer.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+
+void rs232dev_send(void) {
+#if MAX_SIZE > 255
+ u16_t i;
+#else
+ u8_t i;
+#endif /* MAX_SIZE > 255 */
+ volatile u8_t *ptr;
+ u8_t c;
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+ old_char = PEEK(traffic_indicator);
+ POKE(traffic_indicator, UP_ARROW);
+#endif
+
+ SIO_SEND(SLIP_END);
+
+ ptr = uip_buf;
+ for(i = 0; i < uip_len; ++i) {
+ if(i == 40) {
+ ptr = uip_appdata;
+ }
+ c = *ptr++;
+ switch(c) {
+ case SLIP_END:
+ SIO_SEND(SLIP_ESC);
+ SIO_SEND(SLIP_ESC_END);
+ break;
+ case SLIP_ESC:
+ SIO_SEND(SLIP_ESC);
+ SIO_SEND(SLIP_ESC_ESC);
+ break;
+ default:
+ SIO_SEND(c);
+ break;
+ }
+#ifdef FEAT_KEYBOARD_BUFFER
+ keybuf_poll_kbd();
+#endif
+ }
+ SIO_SEND(SLIP_END);
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+ POKE(traffic_indicator, old_char);
+#endif
+}
+
+/*-----------------------------------------------------------------------------------*/
+/*
+ * rs232dev_poll():
+ *
+ * Read all avaliable bytes from the RS232 interface into the slip_buf
+ * buffer. If no more bytes are avaliable, it returns with 0 to
+ * indicate that no packet was immediately ready. When a full packet
+ * has been read into the buffer, the packet is copied into the
+ * uip_buf buffer and the length of the packet is returned.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+
+#if MAX_SIZE > 255
+u16_t
+#else
+u8_t
+#endif /* MAX_SIZE > 255 */
+rs232dev_poll(void) {
+ u8_t c;
+ static u8_t lastc;
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+ old_char = PEEK(traffic_indicator);
+#endif
+
+ while(SIO_POLL(c)) {
+#ifdef FEAT_TRAFFIC_INDICATOR
+ POKE(traffic_indicator, DOWN_ARROW);
+#endif
+#ifdef FEAT_KEYBOARD_BUFFER
+ keybuf_poll_kbd();
+#endif
+ switch(c) {
+ case SLIP_ESC:
+ lastc = c;
+ break;
+
+ case SLIP_END:
+ lastc = c;
+ /* End marker found, we copy our input buffer to the uip_buf
+ buffer and return the size of the packet we copied. */
+ memcpy(uip_buf, slip_buf, len);
+ tmplen = len;
+ len = 0;
+#ifdef FEAT_TRAFFIC_INDICATOR
+ POKE(traffic_indicator, old_char);
+#endif
+ return tmplen;
+
+ default:
+ if(lastc == SLIP_ESC) {
+ lastc = c;
+ /* Previous read byte was an escape byte, so this byte will be
+ interpreted differently from others. */
+ switch(c) {
+ case SLIP_ESC_END:
+ c = SLIP_END;
+ break;
+ case SLIP_ESC_ESC:
+ c = SLIP_ESC;
+ break;
+ }
+ } else {
+ lastc = c;
+ }
+
+ slip_buf[len] = c;
+ ++len;
+
+ if(len > MAX_SIZE) {
+ len = 0;
+ }
+
+ break;
+ }
+ }
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+ POKE(traffic_indicator, old_char);
+#endif
+ return 0;
+}
+
+/*-----------------------------------------------------------------------------------*/
+/*
+ * rs232dev_init():
+ *
+ * Initializes the RS232 device and sets the parameters of the device.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+
+char rs232dev_init(unsigned char baud) {
+ char err;
+
+#ifdef FEAT_TRAFFIC_INDICATOR
+ traffic_indicator = PEEKW(0x58) + 39; /* upper-right corner */
+#endif
+
+ err = rs232_init(0);
+ rs232_err(err);
+ err = rs232_params(baud, RS_PAR_NONE);
+ rs232_err(err);
+
+ len = 0;
+
+ return err;
+}
+/*-----------------------------------------------------------------------------------*/
+
+void rs232dev_close(void) {
+ rs232_done();
+}
diff --git a/src/rs232dev.h b/src/rs232dev.h
new file mode 100644
index 0000000..543ab99
--- /dev/null
+++ b/src/rs232dev.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2001, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Adam Dunkels.
+ * 4. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: rs232dev.h,v 1.1 2001/11/20 20:49:45 adam Exp $
+ *
+ */
+
+#ifndef __RS232DEV_H__
+#define __RS232DEV_H__
+
+#include "uip.h"
+
+char rs232dev_init(unsigned char baud);
+u8_t rs232dev_read(void);
+void rs232dev_send(void);
+void rs232dev_close(void);
+
+#if UIP_BUFSIZE > 255
+u16_t rs232dev_poll(void);
+#else
+u8_t rs232dev_poll(void);
+#endif /* UIP_BUFSIZE > 255 */
+
+#endif /* __RS232DEV_H__ */
diff --git a/src/rvert.com b/src/rvert.com
new file mode 100644
index 0000000..b5aeccc
--- /dev/null
+++ b/src/rvert.com
Binary files differ
diff --git a/src/slattach_rts.diff b/src/slattach_rts.diff
new file mode 100644
index 0000000..d14afe1
--- /dev/null
+++ b/src/slattach_rts.diff
@@ -0,0 +1,26 @@
+--- net-tools-1.60/slattach.c 2008-11-01 12:29:56.000000000 -0400
++++ net-tools-1.60.patched/slattach.c 2008-10-31 21:41:43.000000000 -0400
+@@ -347,6 +347,7 @@
+ tty->c_cflag |= CLOCAL;
+ else
+ tty->c_cflag |= CRTSCTS;
++ tty->c_cflag &= ~CRTSCTS; /* 20081031 bkw: need or not? */
+ tty->c_cflag |= speed; /* restore speed */
+ return(0);
+ }
+@@ -723,6 +724,15 @@
+ (void) signal(SIGQUIT, sig_catch);
+ (void) signal(SIGTERM, sig_catch);
+
++ /* 20081031 bkw: force RTS off (Tucker sio2pc) */
++ {
++ int tstatus;
++ fprintf(stderr, "slattach: RTS forced off (Tucker SIO2PC)\n");
++ ioctl(tty_fd, TIOCMGET, &tstatus);
++ tstatus &= ~TIOCM_RTS;
++ ioctl(tty_fd, TIOCMSET, &tstatus);
++ }
++
+ /* Wait until we get killed if hanging on a terminal. */
+ if (opt_e == 0) {
+ while(1) {
diff --git a/src/slirp_debug b/src/slirp_debug
new file mode 100644
index 0000000..7a2f1b5
--- /dev/null
+++ b/src/slirp_debug
@@ -0,0 +1,2 @@
+Slirp 1.0.16 - Debugging Started.
+Debugging Started level 10.
diff --git a/src/start_getty.sh b/src/start_getty.sh
new file mode 100644
index 0000000..7195d5e
--- /dev/null
+++ b/src/start_getty.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+ATR_IMAGE=${1-dumb.atr}
+TTY=/dev/ttyS0
+
+fuser -k $TTY 2&>/dev/null # make sure nobody's using the port...
+$DELAY
+fuser -k -9 $TTY 2&>/dev/null # Just in case...
+$DELAY
+modprobe atarisio port=$TTY
+$DELAY
+atariserver $ATR_IMAGE
+#atariserver autorun.sys # fails when run from MyPicoDOS, why?
+$DELAY
+rmmod atarisio
+$DELAY
+strace -o/dev/null agetty -L $TTY 4800 vt100 &
+$DELAY
+./clear_rts
diff --git a/src/start_slip.sh b/src/start_slip.sh
new file mode 100755
index 0000000..8a9320a
--- /dev/null
+++ b/src/start_slip.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+# Configurable stuff:
+
+TTY=/dev/ttyUSB0 # serial port to use
+BAUD=9600 # must match compiled-in value in rs232dev.c
+SLATTACH=a8_slattach # slattach binary (possibly patched)
+SLIP_IFACE=sl0 # probably no need to change this
+LOCAL_IP=192.168.0.1 # SLIP IP address for Linux host
+REMOTE_IP=192.168.0.2 # SLIP IP address for Atari host
+IP_FORWARD=yes # Route packets for the Atari?
+IP_MASQUERADE=yes # NAT for the Atari?
+MASQ_IFACE=eth1 # if NATing, our main (LAM or internet) interface
+DUMP_PACKETS=yes # Run tcpdump on sl0 interface?
+
+# DELAY may not be needed on all systems...
+
+# No delay:
+#DELAY="true"
+
+# 1 second:
+#DELAY="sleep 1"
+
+# 1/4 second (may not work on old Linux installs):
+DELAY="usleep 250000"
+
+# End of config section, start of code:
+
+ifconfig $SLIP_IFACE down 2&>/dev/null
+killall $SLATTACH 2&>/dev/null
+fuser -k $TTY 2&>/dev/null # make sure nobody's using the port...
+$DELAY
+fuser -k -9 $TTY 2&>/dev/null # Just in case...
+$DELAY
+
+echo "Starting SLIP on $SLIP_IFACE, local $LOCAL_IP, remote $REMOTE_IP"
+$SLATTACH -L -p slip -s $BAUD $TTY &
+$DELAY
+ifconfig $SLIP_IFACE $LOCAL_IP mtu 576
+ifconfig $SLIP_IFACE $LOCAL_IP pointopoint $REMOTE_IP
+
+if [ "$IP_MASQUERADE" = "yes" ]; then
+ echo "IP Masquerading enabled"
+ iptables -F
+ iptables -t nat -F
+ iptables -t nat -A POSTROUTING -o $MASQ_IFACE -j MASQUERADE
+fi
+
+if [ "$IP_FORWARD" = "yes" ]; then
+ echo "IP Forwarding enabled"
+ echo "1" > /proc/sys/net/ipv4/ip_forward
+fi
+
+if [ "$DUMP_PACKETS" = "yes" ]; then
+ tcpdump -i $SLIP_IFACE -X -n -vvv -s 0
+fi
diff --git a/src/start_slirp.sh b/src/start_slirp.sh
new file mode 100644
index 0000000..4f3ad40
--- /dev/null
+++ b/src/start_slirp.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# Configurable stuff:
+
+TTY=/dev/ttyS0 # serial port to use
+BAUD=4800 # must match FujiChat conf
+
+# This setting is only needed if you're using an AtariMax (Steve Tucker)
+# auto-sensing SIO2PC as your serial device.
+TUCKER_SIO2PC_HACK="yes"
+
+# DELAY is needed on some (most?) systems because e.g. atariserver tries
+# to run before the atarisio module is fully initialized. Choose one:
+
+# No delay:
+#DELAY="true"
+
+# 1 second:
+#DELAY="sleep 1"
+
+# 1/4 second (may not work on old Linux installs):
+DELAY="usleep 250000"
+
+slirp "tty $TTY" "mru 576" "mtu 576" "baudrate $BAUD" &
+
+if [ "$TUCKER_SIO2PC_HACK" = "yes" ]; then
+ sleep 1
+ ./clear_rts
+fi
diff --git a/src/test.atr b/src/test.atr
new file mode 100644
index 0000000..67e0b78
--- /dev/null
+++ b/src/test.atr
Binary files differ
diff --git a/src/testip.c b/src/testip.c
new file mode 100644
index 0000000..44f1086
--- /dev/null
+++ b/src/testip.c
@@ -0,0 +1,10 @@
+
+#include <stdio.h>
+
+extern unsigned char * __fastcall__ new_format_ip (void *);
+
+void main(void) {
+ char ip[4] = { 0xc0, 0xa8, 0x00, 0x01 };
+ puts(new_format_ip(ip));
+HANG: goto HANG;
+}
diff --git a/src/uip-conf.h b/src/uip-conf.h
new file mode 100644
index 0000000..1a9e745
--- /dev/null
+++ b/src/uip-conf.h
@@ -0,0 +1,180 @@
+
+/**
+ * \addtogroup uipopt
+ * @{
+ */
+
+/**
+ * \name Project-specific configuration options
+ * @{
+ *
+ * uIP has a number of configuration options that can be overridden
+ * for each project. These are kept in a project-specific uip-conf.h
+ * file and all configuration names have the prefix UIP_CONF.
+ */
+
+/*
+ * Copyright (c) 2006, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $
+ */
+
+/**
+ * \file
+ * An example uIP configuration file
+ * \author
+ * Adam Dunkels <adam@sics.se>
+ */
+
+#ifndef __UIP_CONF_H__
+#define __UIP_CONF_H__
+
+/**
+ * 8 bit datatype
+ *
+ * This typedef defines the 8-bit type used throughout uIP.
+ *
+ * \hideinitializer
+ */
+typedef unsigned char u8_t;
+
+/**
+ * 16 bit datatype
+ *
+ * This typedef defines the 16-bit type used throughout uIP.
+ *
+ * \hideinitializer
+ */
+typedef unsigned int u16_t;
+
+/**
+ * Statistics datatype
+ *
+ * This typedef defines the dataype used for keeping statistics in
+ * uIP.
+ *
+ * \hideinitializer
+ */
+typedef unsigned short uip_stats_t;
+
+/**
+ * Maximum number of TCP connections.
+ *
+ * \hideinitializer
+ */
+// #define UIP_CONF_MAX_CONNECTIONS 5
+#define UIP_CONF_MAX_CONNECTIONS 1
+#define UIP_CONF_UDP_CONNS 1
+
+/* disable TCP listen support entirely, saves approx. 1K
+ in the binary
+ */
+// #define UIP_CONF_TCP_LISTEN
+#undef UIP_CONF_TCP_LISTEN
+
+/**
+ * Maximum number of listening TCP ports.
+ * (not used if UIP_CONF_TCP_LISTEN is 0)
+ *
+ * \hideinitializer
+ */
+// #define UIP_CONF_MAX_LISTENPORTS 5
+#define UIP_CONF_MAX_LISTENPORTS 1
+
+/**
+ * uIP buffer size.
+ *
+ * \hideinitializer
+ */
+// #define UIP_CONF_BUFFER_SIZE 160
+#define UIP_CONF_BUFFER_SIZE 576
+
+/**
+ * CPU byte order.
+ *
+ * \hideinitializer
+ */
+#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN
+
+/**
+ * Logging on or off
+ *
+ * \hideinitializer
+ */
+#define UIP_CONF_LOGGING 0
+
+/**
+ * UDP support on or off
+ *
+ * \hideinitializer
+ */
+#define UIP_CONF_UDP 1
+
+/**
+ * UDP checksums on or off
+ *
+ * \hideinitializer
+ */
+// #define UIP_CONF_UDP_CHECKSUMS 1
+#define UIP_CONF_UDP_CHECKSUMS 0
+
+/**
+ * uIP statistics on or off
+ *
+ * \hideinitializer
+ */
+#define UIP_CONF_STATISTICS 0
+
+/* 0 for SLIP, 14 for Ethernet */
+#define UIP_CONF_LLH_LEN 0
+
+/* Here we include the header file for the application(s) we use in
+ our project. */
+/*#include "smtp.h"*/
+/*#include "hello-world.h"*/
+/*#include "telnetd.h"*/
+// #include "webclient.h"
+/*#include "dhcpc.h"*/
+/*#include "webclient.h"*/
+
+/*
+#ifdef LIB_ONLY
+#define uip_tcp_appstate_t int
+#undef UIP_CONF_UDP
+#else
+*/
+#include "resolv.h"
+#include "telnet.h"
+// #endif
+
+#endif /* __UIP_CONF_H__ */
+
+/** @} */
+/** @} */
diff --git a/src/uip_arch.h b/src/uip_arch.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/uip_arch.h
diff --git a/src/uip_asm_output.s b/src/uip_asm_output.s
new file mode 100644
index 0000000..7f8c38c
--- /dev/null
+++ b/src/uip_asm_output.s
@@ -0,0 +1,5253 @@
+;
+; File generated by cc65 v 2.12.9
+;
+ .fopt compiler,"cc65 v 2.12.9"
+ .setcpu "6502"
+ .smart on
+ .autoimport on
+ .case on
+ .debuginfo off
+ .importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
+ .macpack longbranch
+ .import _resolv_appcall
+ .import _telnet_app
+ .export _uip_init
+ .export _uip_setipid
+ .export _uip_buf
+ .export _uip_listen
+ .export _uip_unlisten
+ .export _uip_connect
+ .export _uip_send
+ .export _uip_udp_new
+ .export _htons
+ .export _uip_appdata
+ .export _uip_len
+ .export _uip_conn
+ .export _uip_conns
+ .export _uip_acc32
+ .export _uip_udp_conn
+ .export _uip_udp_conns
+ .export _uip_flags
+ .export _uip_process
+ .export _uip_hostaddr
+ .export _uip_netmask
+ .export _uip_draddr
+ .export _uip_chksum
+ .export _uip_ipchksum
+ .export _uip_tcpchksum
+ .import _memcpy
+ .import _memset
+ .export _uip_ethaddr
+ .export _uip_sappdata
+ .export _uip_slen
+ .export _uip_listenports
+ .export _uip_add32
+
+.segment "DATA"
+
+_all_ones_addr:
+ .word $FFFF
+ .word $FFFF
+_all_zeroes_addr:
+ .word $0000
+ .word $0000
+_uip_ethaddr:
+ .byte $00
+ .byte $00
+ .byte $00
+ .byte $00
+ .byte $00
+ .byte $00
+
+.segment "BSS"
+
+_uip_hostaddr:
+ .res 4,$00
+_uip_draddr:
+ .res 4,$00
+_uip_netmask:
+ .res 4,$00
+_uip_buf:
+ .res 578,$00
+_uip_appdata:
+ .res 2,$00
+_uip_sappdata:
+ .res 2,$00
+_uip_len:
+ .res 2,$00
+_uip_slen:
+ .res 2,$00
+_uip_flags:
+ .res 1,$00
+_uip_conn:
+ .res 2,$00
+_uip_conns:
+ .res 35,$00
+_uip_listenports:
+ .res 2,$00
+_uip_udp_conn:
+ .res 2,$00
+_uip_udp_conns:
+ .res 11,$00
+_ipid:
+ .res 2,$00
+_iss:
+ .res 4,$00
+_lastport:
+ .res 2,$00
+_uip_acc32:
+ .res 4,$00
+_c:
+ .res 1,$00
+_opt:
+ .res 1,$00
+_tmp16:
+ .res 2,$00
+
+; ---------------------------------------------------------------
+; void __near__ uip_init (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_init: near
+
+.segment "CODE"
+
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ lda #$00
+ sta _c
+L00BF: lda _c
+ cmp #$01
+ bcs L00C0
+;
+; uip_listenports[c] = 0;
+;
+ ldx #$00
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ inc _c
+ jmp L00BF
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+L00C0: lda #$00
+ sta _c
+L00CA: lda _c
+ cmp #$01
+ bcs L00CB
+;
+; uip_conns[c].tcpstateflags = UIP_CLOSED;
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+ inc _c
+ jmp L00CA
+;
+; lastport = 1024;
+;
+L00CB: ldx #$04
+ lda #$00
+ sta _lastport
+ stx _lastport+1
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+ sta _c
+L00D7: lda _c
+ cmp #$01
+ bcs L00D8
+;
+; uip_udp_conns[c].lport = 0;
+;
+ lda _c
+ jsr pusha0
+ lda #$0B
+ jsr tosmula0
+ clc
+ adc #<(_uip_udp_conns)
+ tay
+ txa
+ adc #>(_uip_udp_conns)
+ tax
+ tya
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$04
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+ inc _c
+ jmp L00D7
+;
+; }
+;
+L00D8: rts
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_setipid (unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_setipid: near
+
+.segment "CODE"
+
+;
+; void uip_setipid(u16_t id) { ipid = id; }
+;
+ jsr ldax0sp
+ sta _ipid
+ stx _ipid+1
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_listen (unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_listen: near
+
+.segment "CODE"
+
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ lda #$00
+ sta _c
+L01AF: lda _c
+ cmp #$01
+ jcs incsp2
+;
+; if(uip_listenports[c] == 0) {
+;
+ ldx #$00
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ jsr ldaxi
+ cpx #$00
+ bne L01B1
+ cmp #$00
+ bne L01B1
+;
+; uip_listenports[c] = port;
+;
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ sta sreg
+ stx sreg+1
+ jsr ldax0sp
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; return;
+;
+ jmp incsp2
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+L01B1: inc _c
+ jmp L01AF
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_unlisten (unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_unlisten: near
+
+.segment "CODE"
+
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ lda #$00
+ sta _c
+L01A0: lda _c
+ cmp #$01
+ jcs incsp2
+;
+; if(uip_listenports[c] == port) {
+;
+ ldx #$00
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ jsr pushw
+ ldy #$03
+ jsr ldaxysp
+ jsr tosicmp
+ bne L01A2
+;
+; uip_listenports[c] = 0;
+;
+ ldx #$00
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ sta sreg
+ stx sreg+1
+ lda #$00
+ tay
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; return;
+;
+ jmp incsp2
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+L01A2: inc _c
+ jmp L01A0
+
+.endproc
+
+; ---------------------------------------------------------------
+; __near__ struct uip_conn* __near__ uip_connect (__near__ unsigned int[2]*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_connect: near
+
+.segment "CODE"
+
+;
+; again:
+;
+ jsr decsp4
+;
+; ++lastport;
+;
+L00E3: inc _lastport
+ bne L00E5
+ inc _lastport+1
+;
+; if(lastport >= 32000) {
+;
+L00E5: ldx _lastport+1
+ cpx #$7D
+ bcc L00E6
+;
+; lastport = 4096;
+;
+ ldx #$10
+ lda #$00
+ sta _lastport
+ stx _lastport+1
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+L00E6: lda #$00
+ sta _c
+L00EA: lda _c
+ cmp #$01
+ bcs L00EB
+;
+; conn = &uip_conns[c];
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ ldy #$02
+ jsr staxysp
+;
+; if(conn->tcpstateflags != UIP_CLOSED &&
+;
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L00EC
+;
+; conn->lport == htons(lastport)) {
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$05
+ jsr pushwidx
+ lda _lastport
+ ldx _lastport+1
+ jsr pushax
+ jsr _htons
+ jsr tosicmp
+ beq L00E3
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+L00EC: inc _c
+ jmp L00EA
+;
+; conn = 0;
+;
+L00EB: ldx #$00
+ txa
+ ldy #$02
+ jsr staxysp
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+ sta _c
+L00FC: lda _c
+ cmp #$01
+ bcs L00FD
+;
+; cconn = &uip_conns[c];
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ jsr stax0sp
+;
+; if(cconn->tcpstateflags == UIP_CLOSED) {
+;
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ bne L0107
+;
+; conn = cconn;
+;
+ jsr ldax0sp
+ ldy #$02
+ jsr staxysp
+;
+; break;
+;
+ jmp L00FD
+;
+; if(cconn->tcpstateflags == UIP_TIME_WAIT) {
+;
+L0107: jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$07
+ bne L00FE
+;
+; if(conn == 0 ||
+;
+ ldy #$02
+ lda (sp),y
+ iny
+ ora (sp),y
+ beq L010E
+;
+; cconn->timer > conn->timer) {
+;
+ jsr ldax0sp
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jsr pusha0
+ ldy #$05
+ jsr ldaxysp
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ beq L00FE
+ bcc L00FE
+;
+; conn = cconn;
+;
+L010E: jsr ldax0sp
+ ldy #$02
+ jsr staxysp
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+L00FE: inc _c
+ jmp L00FC
+;
+; if(conn == 0) {
+;
+L00FD: ldy #$02
+ lda (sp),y
+ iny
+ ora (sp),y
+ bne L0113
+;
+; return 0;
+;
+ tax
+ jmp incsp8
+;
+; conn->tcpstateflags = UIP_SYN_SENT;
+;
+L0113: jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$02
+ ldy #$19
+ sta (sreg),y
+;
+; conn->snd_nxt[0] = iss[0];
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda _iss
+ ldy #$0C
+ sta (sreg),y
+;
+; conn->snd_nxt[1] = iss[1];
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda _iss+1
+ ldy #$0D
+ sta (sreg),y
+;
+; conn->snd_nxt[2] = iss[2];
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda _iss+2
+ ldy #$0E
+ sta (sreg),y
+;
+; conn->snd_nxt[3] = iss[3];
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda _iss+3
+ ldy #$0F
+ sta (sreg),y
+;
+; conn->initialmss = conn->mss = UIP_TCP_MSS;
+;
+ ldy #$05
+ jsr pushwysp
+ ldy #$07
+ jsr pushwysp
+ ldx #$00
+ lda #$78
+ ldy #$12
+ jsr staxspidx
+ ldy #$14
+ jsr staxspidx
+;
+; conn->len = 1; /* TCP length of the SYN is one. */
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$10
+ sta (sreg),y
+ iny
+ lda #$00
+ sta (sreg),y
+;
+; conn->nrtx = 0;
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1B
+ sta (sreg),y
+;
+; conn->timer = 1; /* Send the SYN next time around. */
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$1A
+ sta (sreg),y
+;
+; conn->rto = UIP_RTO;
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$03
+ ldy #$18
+ sta (sreg),y
+;
+; conn->sa = 0;
+;
+ tay
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$16
+ sta (sreg),y
+;
+; conn->sv = 16; /* Initial value of the RTT variance. */
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ lda #$10
+ ldy #$17
+ sta (sreg),y
+;
+; conn->lport = htons(lastport);
+;
+ ldy #$05
+ jsr pushwysp
+ lda _lastport
+ ldx _lastport+1
+ jsr pushax
+ jsr _htons
+ ldy #$04
+ jsr staxspidx
+;
+; conn->rport = rport;
+;
+ dey
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ ldy #$05
+ jsr ldaxysp
+ ldy #$06
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(&conn->ripaddr, ripaddr);
+;
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ ldy #$07
+ jsr ldaxysp
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ ldy #$03
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ ldy #$07
+ jsr ldaxysp
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; return conn;
+;
+ jsr ldaxysp
+;
+; }
+;
+ jmp incsp8
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_send (__near__ const void*, int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_send: near
+
+.segment "CODE"
+
+;
+; if(len > 0) {
+;
+ jsr pushw0sp
+ lda #$01
+ jsr tosgea0
+ jeq incsp4
+;
+; uip_slen = len;
+;
+ jsr ldax0sp
+ sta _uip_slen
+ stx _uip_slen+1
+;
+; if(data != uip_sappdata) {
+;
+ ldy #$05
+ jsr pushwysp
+ lda _uip_sappdata
+ ldx _uip_sappdata+1
+ jsr tosicmp
+ jeq incsp4
+;
+; memcpy(uip_sappdata, (data), uip_slen);
+;
+ lda _uip_sappdata
+ ldx _uip_sappdata+1
+ jsr pushax
+ ldy #$07
+ jsr pushwysp
+ lda _uip_slen
+ ldx _uip_slen+1
+ jsr _memcpy
+;
+; }
+;
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; __near__ struct uip_udp_conn* __near__ uip_udp_new (__near__ unsigned int[2]*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_udp_new: near
+
+.segment "CODE"
+
+;
+; again:
+;
+ jsr decsp2
+;
+; ++lastport;
+;
+L0151: inc _lastport
+ bne L0153
+ inc _lastport+1
+;
+; if(lastport >= 32000) {
+;
+L0153: ldx _lastport+1
+ cpx #$7D
+ bcc L0154
+;
+; lastport = 4096;
+;
+ ldx #$10
+ lda #$00
+ sta _lastport
+ stx _lastport+1
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+L0154: lda #$00
+ sta _c
+L0158: lda _c
+ cmp #$01
+ bcs L0159
+;
+; if(uip_udp_conns[c].lport == htons(lastport)) {
+;
+ lda _c
+ jsr pusha0
+ lda #$0B
+ jsr tosmula0
+ clc
+ adc #<(_uip_udp_conns)
+ tay
+ txa
+ adc #>(_uip_udp_conns)
+ tax
+ tya
+ ldy #$05
+ jsr pushwidx
+ lda _lastport
+ ldx _lastport+1
+ jsr pushax
+ jsr _htons
+ jsr tosicmp
+;
+; goto again;
+;
+ beq L0151
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+ inc _c
+ jmp L0158
+;
+; conn = 0;
+;
+L0159: ldx #$00
+ txa
+ jsr stax0sp
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+ sta _c
+L0166: lda _c
+ cmp #$01
+ bcs L0167
+;
+; if(uip_udp_conns[c].lport == 0) {
+;
+ lda _c
+ jsr pusha0
+ lda #$0B
+ jsr tosmula0
+ clc
+ adc #<(_uip_udp_conns)
+ tay
+ txa
+ adc #>(_uip_udp_conns)
+ tax
+ tya
+ ldy #$05
+ jsr ldaxidx
+ cpx #$00
+ bne L0168
+ cmp #$00
+ bne L0168
+;
+; conn = &uip_udp_conns[c];
+;
+ lda _c
+ jsr pusha0
+ lda #$0B
+ jsr tosmula0
+ clc
+ adc #<(_uip_udp_conns)
+ tay
+ txa
+ adc #>(_uip_udp_conns)
+ tax
+ tya
+ jsr stax0sp
+;
+; break;
+;
+ jmp L0167
+;
+; for(c = 0; c < UIP_UDP_CONNS; ++c) {
+;
+L0168: inc _c
+ jmp L0166
+;
+; if(conn == 0) {
+;
+L0167: ldy #$00
+ lda (sp),y
+ iny
+ ora (sp),y
+ bne L0175
+;
+; return 0;
+;
+ tax
+ jmp incsp6
+;
+; conn->lport = HTONS(lastport);
+;
+L0175: jsr ldax0sp
+ sta ptr1
+ stx ptr1+1
+ ldx _lastport
+ stx sreg+1
+ ldx #$00
+ lda _lastport+1
+ sta sreg
+ txa
+ ora sreg+1
+ tax
+ lda sreg
+ ldy #$04
+ sta (ptr1),y
+ iny
+ txa
+ sta (ptr1),y
+;
+; conn->rport = rport;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ ldy #$03
+ jsr ldaxysp
+ ldy #$06
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; if(ripaddr == NULL) {
+;
+ ldy #$04
+ lda (sp),y
+ iny
+ ora (sp),y
+ bne L0184
+;
+; memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$03
+L087D: sta (sreg),y
+ dey
+ bpl L087D
+;
+; } else {
+;
+ jmp L018E
+;
+; uip_ipaddr_copy(&conn->ripaddr, ripaddr);
+;
+L0184: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ ldy #$05
+ jsr ldaxysp
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ ldy #$05
+ jsr ldaxysp
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; conn->ttl = UIP_TTL;
+;
+L018E: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$40
+ ldy #$08
+ sta (sreg),y
+;
+; return conn;
+;
+ jsr ldax0sp
+;
+; }
+;
+ jmp incsp6
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ htons (unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _htons: near
+
+.segment "CODE"
+
+;
+; return HTONS(val);
+;
+ ldy #$00
+ lda (sp),y
+ tax
+ stx sreg+1
+ ldx #$00
+ iny
+ lda (sp),y
+ sta sreg
+ txa
+ ora sreg+1
+ tax
+ lda sreg
+;
+; }
+;
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_process (unsigned char)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_process: near
+
+.segment "CODE"
+
+;
+; register struct uip_conn *uip_connr = uip_conn;
+;
+ lda _uip_conn
+ ldx _uip_conn+1
+ jsr pushax
+;
+; if(flag == UIP_UDP_SEND_CONN) {
+;
+ ldy #$02
+ lda (sp),y
+ cmp #$04
+;
+; goto udp_send;
+;
+ jeq L01D6
+;
+; uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN];
+;
+ lda #<(_uip_buf+40)
+ ldx #>(_uip_buf+40)
+ sta _uip_appdata
+ stx _uip_appdata+1
+ sta _uip_sappdata
+ stx _uip_sappdata+1
+;
+; if(flag == UIP_POLL_REQUEST) {
+;
+ lda (sp),y
+ cmp #$03
+ bne L01DC
+;
+; if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$0F
+ cmp #$03
+ jne L01EA
+;
+; !uip_outstanding(uip_connr)) {
+;
+ jsr ldax0sp
+ ldy #$11
+ jsr ldaxidx
+ stx tmp1
+ ora tmp1
+ jne L01EA
+;
+; uip_flags = UIP_POLL;
+;
+ lda #$08
+ sta _uip_flags
+;
+; goto appsend;
+;
+ jmp L0888
+;
+; } else if(flag == UIP_TIMER) {
+;
+L01DC: lda (sp),y
+ cmp #$02
+ jne L01EC
+;
+; if(++iss[3] == 0) {
+;
+ inc _iss+3
+ lda _iss+3
+ bne L01F4
+;
+; if(++iss[2] == 0) {
+;
+ inc _iss+2
+ lda _iss+2
+ bne L01F4
+;
+; if(++iss[1] == 0) {
+;
+ inc _iss+1
+ lda _iss+1
+ bne L01F4
+;
+; ++iss[0];
+;
+ inc _iss
+;
+; uip_len = 0;
+;
+L01F4: lda #$00
+ sta _uip_len
+ sta _uip_len+1
+;
+; uip_slen = 0;
+;
+ sta _uip_slen
+ sta _uip_slen+1
+;
+; if(uip_connr->tcpstateflags == UIP_TIME_WAIT ||
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$07
+ beq L01FE
+;
+; uip_connr->tcpstateflags == UIP_FIN_WAIT_2) {
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$05
+ bne L01FD
+;
+; ++(uip_connr->timer);
+;
+L01FE: jsr ldax0sp
+ sta ptr1
+ stx ptr1+1
+ ldy #$1A
+ lda #$01
+ clc
+ adc (ptr1),y
+ sta (ptr1),y
+;
+; if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) {
+;
+ jsr ldax0sp
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$78
+ jne L01EA
+;
+; uip_connr->tcpstateflags = UIP_CLOSED;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; } else if(uip_connr->tcpstateflags != UIP_CLOSED) {
+;
+ jmp L01EA
+L01FD: jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jeq L01EA
+;
+; if(uip_outstanding(uip_connr)) {
+;
+ jsr ldax0sp
+ ldy #$10
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ iny
+ ora (ptr1),y
+ jeq L0209
+;
+; if(uip_connr->timer-- == 0) {
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ pha
+ sec
+ sbc #$01
+ sta (sreg),y
+ pla
+ jne L01EA
+;
+; if(uip_connr->nrtx == UIP_MAXRTX ||
+;
+ jsr ldax0sp
+ ldy #$1B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$08
+ beq L0210
+;
+; ((uip_connr->tcpstateflags == UIP_SYN_SENT ||
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$02
+ beq L0212
+;
+; uip_connr->tcpstateflags == UIP_SYN_RCVD) &&
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$01
+ bne L020F
+;
+; uip_connr->nrtx == UIP_MAXSYNRTX)) {
+;
+L0212: jsr ldax0sp
+ ldy #$1B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$05
+ bne L020F
+;
+; uip_connr->tcpstateflags = UIP_CLOSED;
+;
+L0210: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; uip_flags = UIP_TIMEDOUT;
+;
+ lda #$80
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; BUF->flags = TCP_RST | TCP_ACK;
+;
+ lda #$14
+;
+; goto tcp_send_nodata;
+;
+ jmp L0889
+;
+; uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4?
+;
+L020F: jsr pushw0sp
+ jsr push3
+ ldy #$05
+ jsr ldaxysp
+ ldy #$1B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ cmp #$05
+;
+; 4:
+;
+ bcc L0224
+ lda #$04
+;
+; uip_connr->nrtx);
+;
+ jmp L0226
+L0224: ldy #$05
+ jsr ldaxysp
+ ldy #$1B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+L0226: jsr tosaslax
+ ldy #$1A
+ jsr staspidx
+;
+; ++(uip_connr->nrtx);
+;
+ jsr ldax0sp
+ sta ptr1
+ stx ptr1+1
+ ldy #$1B
+ lda #$01
+ clc
+ adc (ptr1),y
+ sta (ptr1),y
+;
+; switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$0F
+;
+; }
+;
+ cmp #$01
+ jeq L0230
+ cmp #$02
+ beq L0232
+ cmp #$03
+ beq L0239
+ cmp #$04
+ jeq L0244
+ cmp #$06
+ jeq L0244
+ cmp #$08
+ jeq L0244
+ jmp L01EA
+;
+; BUF->flags = 0;
+;
+L0232: lda #$00
+;
+; goto tcp_send_syn;
+;
+ jmp L088A
+;
+; uip_flags = UIP_REXMIT;
+;
+L0239: lda #$04
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; goto apprexmit;
+;
+ jmp L023D
+;
+; } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
+;
+L0209: jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$0F
+ cmp #$03
+ jne L01EA
+;
+; uip_flags = UIP_POLL;
+;
+ lda #$08
+ sta _uip_flags
+;
+; goto appsend;
+;
+ jmp L0888
+;
+; if(flag == UIP_UDP_TIMER) {
+;
+L01EC: lda (sp),y
+ cmp #$05
+ bne L024D
+;
+; if(uip_udp_conn->lport != 0) {
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$05
+ jsr ldaxidx
+ cpx #$00
+ bne L0895
+ cmp #$00
+ jeq L01EA
+;
+; uip_conn = NULL;
+;
+L0895: lda #$00
+ sta _uip_conn
+ sta _uip_conn+1
+;
+; uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
+;
+ lda #<(_uip_buf+28)
+ ldx #>(_uip_buf+28)
+ sta _uip_appdata
+ stx _uip_appdata+1
+ sta _uip_sappdata
+ stx _uip_sappdata+1
+;
+; uip_len = uip_slen = 0;
+;
+ lda #$00
+ sta _uip_slen
+ sta _uip_slen+1
+ sta _uip_len
+ sta _uip_len+1
+;
+; uip_flags = UIP_POLL;
+;
+ lda #$08
+ sta _uip_flags
+;
+; goto udp_send;
+;
+ jmp L088B
+;
+; if(BUF->vhl != 0x45) { /* IP version and header length. */
+;
+L024D: lda _uip_buf
+ cmp #$45
+;
+; goto drop;
+;
+ jne L01EA
+;
+; if((BUF->len[0] << 8) + BUF->len[1] <= uip_len) {
+;
+ ldx _uip_buf+2
+ lda #$00
+ clc
+ adc _uip_buf+3
+ bcc L087E
+ inx
+L087E: jsr pushax
+ lda _uip_len
+ ldx _uip_len+1
+ jsr tosicmp
+ beq L0891
+ jcs L01EA
+;
+; uip_len = (BUF->len[0] << 8) + BUF->len[1];
+;
+L0891: ldx _uip_buf+2
+ lda #$00
+ clc
+ adc _uip_buf+3
+ bcc L087F
+ inx
+L087F: sta _uip_len
+ stx _uip_len+1
+;
+; if((BUF->ipoffset[0] & 0x3f) != 0 ||
+;
+ lda _uip_buf+6
+ and #$3F
+ jne L01EA
+;
+; BUF->ipoffset[1] != 0) {
+;
+ lda _uip_buf+7
+ jne L01EA
+;
+; if(uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr)) {
+;
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr pushw
+ lda #<(_all_zeroes_addr)
+ ldx #>(_all_zeroes_addr)
+ jsr ldaxi
+ jsr tosicmp
+ bne L0282
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr pushwidx
+ lda #<(_all_zeroes_addr)
+ ldx #>(_all_zeroes_addr)
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ beq L0290
+;
+; if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr)) {
+;
+L0282: lda #<(_uip_buf+16)
+ ldx #>(_uip_buf+16)
+ jsr pushw
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr ldaxi
+ jsr tosicmp
+ bne L0299
+ lda #<(_uip_buf+16)
+ ldx #>(_uip_buf+16)
+ ldy #$03
+ jsr pushwidx
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ beq L0292
+L0299: lda #$00
+ jmp L02A0
+L0292: lda #$01
+L02A0: jsr bnega
+;
+; goto drop;
+;
+ jne L01EA
+;
+; checksum. */
+;
+L0290: jsr _uip_ipchksum
+ cpx #$FF
+ jne L01EA
+ cmp #$FF
+;
+; goto drop;
+;
+ jne L01EA
+;
+; processing. */
+;
+ lda _uip_buf+9
+ cmp #$06
+;
+; goto tcp_input;
+;
+ jeq L02A8
+;
+; if(BUF->proto == UIP_PROTO_UDP) {
+;
+ lda _uip_buf+9
+ cmp #$11
+;
+; goto udp_input;
+;
+ jeq L02AD
+;
+; here. */
+;
+ lda _uip_buf+9
+ cmp #$01
+;
+; goto drop;
+;
+ jne L01EA
+;
+; if(ICMPBUF->type != ICMP_ECHO) {
+;
+ lda _uip_buf+20
+ cmp #$08
+;
+; goto drop;
+;
+ jne L01EA
+;
+; ICMPBUF->type = ICMP_ECHO_REPLY;
+;
+ lda #$00
+ sta _uip_buf+20
+;
+; if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) {
+;
+ lda _uip_buf+22+1
+ cmp #$FF
+ bne L02C7
+ lda _uip_buf+22
+ cmp #$F7
+L02C7: bcc L02BA
+;
+; ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1;
+;
+ lda #$09
+;
+; } else {
+;
+ jmp L089F
+;
+; ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8);
+;
+L02BA: lda #$08
+L089F: clc
+ adc _uip_buf+22
+ sta _uip_buf+22
+ bcc L02E0
+ inc _uip_buf+22+1
+;
+; uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
+;
+L02E0: lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+;
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; goto send;
+;
+ jmp L030D
+;
+; uip_len = uip_len - UIP_IPUDPH_LEN;
+;
+L02AD: lda _uip_len
+ ldx _uip_len+1
+ ldy #$1C
+ jsr decaxy
+ sta _uip_len
+ stx _uip_len+1
+;
+; for(uip_udp_conn = &uip_udp_conns[0];
+;
+ lda #<(_uip_udp_conns)
+ sta _uip_udp_conn
+ lda #>(_uip_udp_conns)
+ sta _uip_udp_conn+1
+;
+; uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS];
+;
+L0311: lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ jsr pushax
+ lda #<(_uip_udp_conns+11)
+ ldx #>(_uip_udp_conns+11)
+ jsr tosicmp
+ jcs L01EA
+;
+; if(uip_udp_conn->lport != 0 &&
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$05
+ jsr ldaxidx
+ cpx #$00
+ bne L0896
+ cmp #$00
+ jeq L0313
+;
+; UDPBUF->destport == uip_udp_conn->lport &&
+;
+L0896: lda _uip_buf+22
+ ldx _uip_buf+22+1
+ jsr pushax
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$05
+ jsr ldaxidx
+ jsr tosicmp
+ jne L0313
+;
+; (uip_udp_conn->rport == 0 ||
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$07
+ jsr ldaxidx
+ cpx #$00
+ bne L0897
+ cmp #$00
+ beq L0322
+;
+; UDPBUF->srcport == uip_udp_conn->rport) &&
+;
+L0897: lda _uip_buf+20
+ ldx _uip_buf+20+1
+ jsr pushax
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$07
+ jsr ldaxidx
+ jsr tosicmp
+ jne L0313
+;
+; (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) ||
+;
+L0322: lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ jsr pushw
+ lda #<(_all_zeroes_addr)
+ ldx #>(_all_zeroes_addr)
+ jsr ldaxi
+ jsr tosicmp
+ bne L0885
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$03
+ jsr pushwidx
+ lda #<(_all_zeroes_addr)
+ ldx #>(_all_zeroes_addr)
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ beq L034F
+;
+; uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) ||
+;
+L0885: lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ jsr pushw
+ lda #<(_all_ones_addr)
+ ldx #>(_all_ones_addr)
+ jsr ldaxi
+ jsr tosicmp
+ bne L0886
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$03
+ jsr pushwidx
+ lda #<(_all_ones_addr)
+ ldx #>(_all_ones_addr)
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ beq L034F
+;
+; uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) {
+;
+L0886: lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr pushw
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ jsr ldaxi
+ jsr tosicmp
+ bne L0313
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ ldy #$03
+ jsr pushwidx
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ beq L034F
+;
+; ++uip_udp_conn) {
+;
+L0313: lda #$0B
+ clc
+ adc _uip_udp_conn
+ sta _uip_udp_conn
+ jcc L0311
+ inc _uip_udp_conn+1
+ jmp L0311
+;
+; uip_conn = NULL;
+;
+L034F: lda #$00
+ sta _uip_conn
+ sta _uip_conn+1
+;
+; uip_flags = UIP_NEWDATA;
+;
+ lda #$02
+ sta _uip_flags
+;
+; uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
+;
+ lda #<(_uip_buf+28)
+ ldx #>(_uip_buf+28)
+ sta _uip_appdata
+ stx _uip_appdata+1
+ sta _uip_sappdata
+ stx _uip_sappdata+1
+;
+; uip_slen = 0;
+;
+ lda #$00
+ sta _uip_slen
+ sta _uip_slen+1
+;
+; UIP_UDP_APPCALL();
+;
+L088B: jsr _resolv_appcall
+;
+; if(uip_slen == 0) {
+;
+L01D6: lda _uip_slen
+ ora _uip_slen+1
+;
+; goto drop;
+;
+ jeq L01EA
+;
+; uip_len = uip_slen + UIP_IPUDPH_LEN;
+;
+ lda _uip_slen
+ ldx _uip_slen+1
+ ldy #$1C
+ jsr incaxy
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->len[0] = (uip_len >> 8);
+;
+ lda _uip_len+1
+ sta _uip_buf+2
+;
+; BUF->len[1] = (uip_len & 0xff);
+;
+ lda _uip_len
+ sta _uip_buf+3
+;
+; BUF->ttl = uip_udp_conn->ttl;
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$08
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+8
+;
+; BUF->proto = UIP_PROTO_UDP;
+;
+ lda #$11
+ sta _uip_buf+9
+;
+; UDPBUF->udplen = HTONS(uip_slen + UIP_UDPH_LEN);
+;
+ lda _uip_slen
+ clc
+ adc #$08
+ tax
+ lda #$00
+ jsr pushax
+ lda _uip_slen
+ ldx _uip_slen+1
+ jsr incax8
+ txa
+ ldx #$00
+ jsr tosorax
+ sta _uip_buf+24
+ stx _uip_buf+24+1
+;
+; UDPBUF->udpchksum = 0;
+;
+ lda #$00
+ sta _uip_buf+26
+ sta _uip_buf+26+1
+;
+; BUF->srcport = uip_udp_conn->lport;
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$05
+ jsr ldaxidx
+ sta _uip_buf+20
+ stx _uip_buf+20+1
+;
+; BUF->destport = uip_udp_conn->rport;
+;
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$07
+ jsr ldaxidx
+ sta _uip_buf+22
+ stx _uip_buf+22+1
+;
+; uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+;
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(BUF->destipaddr, uip_udp_conn->ripaddr);
+;
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda _uip_udp_conn
+ ldx _uip_udp_conn+1
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN];
+;
+ lda #<(_uip_buf+40)
+ sta _uip_appdata
+ lda #>(_uip_buf+40)
+ sta _uip_appdata+1
+;
+; goto ip_send_nolen;
+;
+ jmp L03B9
+;
+; checksum. */
+;
+L02A8: jsr _uip_tcpchksum
+ cpx #$FF
+ jne L01EA
+ cmp #$FF
+;
+; goto drop;
+;
+ jne L01EA
+;
+; for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1];
+;
+ lda #<(_uip_conns)
+ ldx #>(_uip_conns)
+ jsr stax0sp
+L03BD: jsr pushw0sp
+ lda #<(_uip_conns)
+ ldx #>(_uip_conns)
+ jsr tosicmp
+ beq L0892
+ bcs L03BE
+;
+; if(uip_connr->tcpstateflags != UIP_CLOSED &&
+;
+L0892: jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ beq L03BF
+;
+; BUF->destport == uip_connr->lport &&
+;
+ lda _uip_buf+22
+ ldx _uip_buf+22+1
+ jsr pushax
+ ldy #$03
+ jsr ldaxysp
+ ldy #$05
+ jsr ldaxidx
+ jsr tosicmp
+ bne L03BF
+;
+; BUF->srcport == uip_connr->rport &&
+;
+ lda _uip_buf+20
+ ldx _uip_buf+20+1
+ jsr pushax
+ ldy #$03
+ jsr ldaxysp
+ ldy #$07
+ jsr ldaxidx
+ jsr tosicmp
+ bne L03BF
+;
+; uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr)) {
+;
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr pushw
+ ldy #$03
+ jsr ldaxysp
+ jsr ldaxi
+ jsr tosicmp
+ bne L03BF
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ ldy #$03
+ jsr pushwidx
+ ldy #$03
+ jsr ldaxysp
+ ldy #$03
+ jsr ldaxidx
+ jsr tosicmp
+ jeq L03DE
+;
+; ++uip_connr) {
+;
+L03BF: ldx #$00
+ lda #$23
+ jsr addeq0sp
+ jmp L03BD
+;
+; if((BUF->flags & TCP_CTL) != TCP_SYN) {
+;
+L03BE: lda _uip_buf+33
+ and #$3F
+ cmp #$02
+;
+; goto reset;
+;
+ bne L03E5
+;
+; tmp16 = BUF->destport;
+;
+ lda _uip_buf+22
+ sta _tmp16
+ lda _uip_buf+22+1
+ sta _tmp16+1
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ lda #$00
+ sta _c
+L03EA: lda _c
+ cmp #$01
+ bcs L03E5
+;
+; if(tmp16 == uip_listenports[c])
+;
+ lda _tmp16
+ ldx _tmp16+1
+ jsr pushax
+ ldx #$00
+ lda _c
+ jsr aslax1
+ clc
+ adc #<(_uip_listenports)
+ tay
+ txa
+ adc #>(_uip_listenports)
+ tax
+ tya
+ jsr ldaxi
+ jsr tosicmp
+;
+; goto found_listen;
+;
+ jeq L03F5
+;
+; for(c = 0; c < UIP_LISTENPORTS; ++c) {
+;
+ inc _c
+ jmp L03EA
+;
+; if(BUF->flags & TCP_RST) {
+;
+L03E5: lda _uip_buf+33
+ and #$04
+;
+; goto drop;
+;
+ jne L01EA
+;
+; BUF->flags = TCP_RST | TCP_ACK;
+;
+ lda #$14
+ sta _uip_buf+33
+;
+; uip_len = UIP_IPTCPH_LEN;
+;
+ ldx #$00
+ lda #$28
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->tcpoffset = 5 << 4;
+;
+ lda #$50
+ sta _uip_buf+32
+;
+; c = BUF->seqno[3];
+;
+ lda _uip_buf+27
+ sta _c
+;
+; BUF->seqno[3] = BUF->ackno[3];
+;
+ lda _uip_buf+31
+ sta _uip_buf+27
+;
+; BUF->ackno[3] = c;
+;
+ lda _c
+ sta _uip_buf+31
+;
+; c = BUF->seqno[2];
+;
+ lda _uip_buf+26
+ sta _c
+;
+; BUF->seqno[2] = BUF->ackno[2];
+;
+ lda _uip_buf+30
+ sta _uip_buf+26
+;
+; BUF->ackno[2] = c;
+;
+ lda _c
+ sta _uip_buf+30
+;
+; c = BUF->seqno[1];
+;
+ lda _uip_buf+25
+ sta _c
+;
+; BUF->seqno[1] = BUF->ackno[1];
+;
+ lda _uip_buf+29
+ sta _uip_buf+25
+;
+; BUF->ackno[1] = c;
+;
+ lda _c
+ sta _uip_buf+29
+;
+; c = BUF->seqno[0];
+;
+ lda _uip_buf+24
+ sta _c
+;
+; BUF->seqno[0] = BUF->ackno[0];
+;
+ lda _uip_buf+28
+ sta _uip_buf+24
+;
+; BUF->ackno[0] = c;
+;
+ lda _c
+ sta _uip_buf+28
+;
+; if(++BUF->ackno[3] == 0) {
+;
+ inc _uip_buf+31
+ lda _uip_buf+31
+ bne L044D
+;
+; if(++BUF->ackno[2] == 0) {
+;
+ inc _uip_buf+30
+ lda _uip_buf+30
+ bne L044D
+;
+; if(++BUF->ackno[1] == 0) {
+;
+ inc _uip_buf+29
+ lda _uip_buf+29
+ bne L044D
+;
+; ++BUF->ackno[0];
+;
+ inc _uip_buf+28
+;
+; tmp16 = BUF->srcport;
+;
+L044D: lda _uip_buf+20
+ sta _tmp16
+ lda _uip_buf+20+1
+ sta _tmp16+1
+;
+; BUF->srcport = BUF->destport;
+;
+ lda _uip_buf+22
+ sta _uip_buf+20
+ lda _uip_buf+22+1
+ sta _uip_buf+20+1
+;
+; BUF->destport = tmp16;
+;
+ lda _tmp16
+ sta _uip_buf+22
+ lda _tmp16+1
+ sta _uip_buf+22+1
+;
+; uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
+;
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+;
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; goto tcp_send_noconn;
+;
+ jmp L049A
+;
+; uip_connr = 0;
+;
+L03F5: ldx #$00
+ txa
+ jsr stax0sp
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+ sta _c
+L049D: lda _c
+ cmp #$01
+ jcs L049E
+;
+; if(uip_conns[c].tcpstateflags == UIP_CLOSED) {
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ sta ptr1
+ txa
+ adc #>(_uip_conns)
+ sta ptr1+1
+ ldy #$19
+ lda (ptr1),y
+ bne L04A5
+;
+; uip_connr = &uip_conns[c];
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ jsr stax0sp
+;
+; break;
+;
+ jmp L049E
+;
+; if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) {
+;
+L04A5: lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ sta ptr1
+ txa
+ adc #>(_uip_conns)
+ sta ptr1+1
+ ldy #$19
+ lda (ptr1),y
+ cmp #$07
+ bne L049F
+;
+; if(uip_connr == 0 ||
+;
+ ldy #$00
+ lda (sp),y
+ iny
+ ora (sp),y
+ beq L04AF
+;
+; uip_conns[c].timer > uip_connr->timer) {
+;
+ lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ sta ptr1
+ txa
+ adc #>(_uip_conns)
+ sta ptr1+1
+ ldy #$1A
+ lda (ptr1),y
+ jsr pusha0
+ ldy #$03
+ jsr ldaxysp
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ beq L049F
+ bcc L049F
+;
+; uip_connr = &uip_conns[c];
+;
+L04AF: lda _c
+ jsr pusha0
+ lda #$23
+ jsr tosmula0
+ clc
+ adc #<(_uip_conns)
+ tay
+ txa
+ adc #>(_uip_conns)
+ tax
+ tya
+ jsr stax0sp
+;
+; for(c = 0; c < UIP_CONNS; ++c) {
+;
+L049F: inc _c
+ jmp L049D
+;
+; if(uip_connr == 0) {
+;
+L049E: ldy #$00
+ lda (sp),y
+ iny
+ ora (sp),y
+;
+; goto drop;
+;
+ jeq L01EA
+;
+; uip_conn = uip_connr;
+;
+ jsr ldax0sp
+ sta _uip_conn
+ stx _uip_conn+1
+;
+; uip_connr->rto = uip_connr->timer = UIP_RTO;
+;
+ jsr ldax0sp
+ sta ptr1
+ stx ptr1+1
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$03
+ ldy #$1A
+ sta (sreg),y
+ ldy #$18
+ sta (ptr1),y
+;
+; uip_connr->sa = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$16
+ sta (sreg),y
+;
+; uip_connr->sv = 4;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$04
+ ldy #$17
+ sta (sreg),y
+;
+; uip_connr->nrtx = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1B
+ sta (sreg),y
+;
+; uip_connr->lport = BUF->destport;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+22
+ ldx _uip_buf+22+1
+ ldy #$04
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_connr->rport = BUF->srcport;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+20
+ ldx _uip_buf+20+1
+ ldy #$06
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(uip_connr->ripaddr, BUF->srcipaddr);
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_connr->tcpstateflags = UIP_SYN_RCVD;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[0] = iss[0];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _iss
+ ldy #$0C
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[1] = iss[1];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _iss+1
+ ldy #$0D
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[2] = iss[2];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _iss+2
+ ldy #$0E
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[3] = iss[3];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _iss+3
+ ldy #$0F
+ sta (sreg),y
+;
+; uip_connr->len = 1;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$10
+ sta (sreg),y
+ iny
+ lda #$00
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[3] = BUF->seqno[3];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+27
+ ldy #$0B
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[2] = BUF->seqno[2];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+26
+ ldy #$0A
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[1] = BUF->seqno[1];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+25
+ ldy #$09
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[0] = BUF->seqno[0];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+24
+ ldy #$08
+ sta (sreg),y
+;
+; uip_add_rcv_nxt(1);
+;
+ jsr push1
+ jsr _uip_add_rcv_nxt
+;
+; if((BUF->tcpoffset & 0xf0) > 0x50) {
+;
+ lda _uip_buf+32
+ and #$F0
+ cmp #$51
+ jcc L0230
+;
+; for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
+;
+ lda #$00
+L088C: sta _c
+L0514: lda _c
+ jsr pusha0
+ lda _uip_buf+32
+ jsr asrax4
+ jsr decax5
+ jsr aslax2
+ jsr tosicmp
+ jcs L0230
+;
+; opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c];
+;
+ ldx #$00
+ lda _c
+ ldy #$28
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ sta _opt
+;
+; if(opt == TCP_OPT_END) {
+;
+ lda _opt
+;
+; break;
+;
+ jeq L0230
+;
+; } else if(opt == TCP_OPT_NOOP) {
+;
+ lda _opt
+ cmp #$01
+ bne L0526
+;
+; ++c;
+;
+ inc _c
+;
+; } else if(opt == TCP_OPT_MSS &&
+;
+ jmp L0514
+L0526: lda _opt
+ cmp #$02
+ jne L052A
+;
+; uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
+;
+ ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ cmp #$04
+ bne L052A
+;
+; tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
+;
+ ldx #$00
+ lda _c
+ ldy #$2A
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ tax
+ tya
+;
+; (u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c];
+;
+ jsr pushax
+ tax
+ lda _c
+ ldy #$2B
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ ldx #$00
+ lda (ptr1),y
+ jsr tosorax
+ sta _tmp16
+ stx _tmp16+1
+;
+; uip_connr->initialmss = uip_connr->mss =
+;
+ jsr pushw0sp
+ ldy #$05
+;
+; tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
+;
+ jsr pushwysp
+ lda _tmp16+1
+ cmp #$00
+ bne L053C
+ lda _tmp16
+ cmp #$79
+L053C: bcc L053D
+ ldx #$00
+ lda #$78
+ jmp L0541
+L053D: lda _tmp16
+ ldx _tmp16+1
+L0541: ldy #$12
+ jsr staxspidx
+ ldy #$14
+ jsr staxspidx
+;
+; break;
+;
+ jmp L0230
+;
+; if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
+;
+L052A: ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+;
+; break;
+;
+ beq L0230
+;
+; c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
+;
+ ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ clc
+ adc _c
+;
+; }
+;
+ jmp L088C
+;
+; BUF->flags = TCP_ACK;
+;
+L0230: lda #$10
+L088A: sta _uip_buf+33
+;
+; BUF->flags |= TCP_SYN;
+;
+ ora #$02
+ sta _uip_buf+33
+;
+; BUF->optdata[0] = TCP_OPT_MSS;
+;
+ lda #$02
+ sta _uip_buf+40
+;
+; BUF->optdata[1] = TCP_OPT_MSS_LEN;
+;
+ lda #$04
+ sta _uip_buf+41
+;
+; BUF->optdata[2] = (UIP_TCP_MSS) / 256;
+;
+ lda #$00
+ sta _uip_buf+42
+;
+; BUF->optdata[3] = (UIP_TCP_MSS) & 255;
+;
+ lda #$78
+ sta _uip_buf+43
+;
+; uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN;
+;
+ ldx #$00
+ lda #$2C
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4;
+;
+ lda #$60
+;
+; goto tcp_send;
+;
+ jmp L088D
+;
+; uip_conn = uip_connr;
+;
+L03DE: jsr ldax0sp
+ sta _uip_conn
+ stx _uip_conn+1
+;
+; uip_flags = 0;
+;
+ lda #$00
+ sta _uip_flags
+;
+; if(BUF->flags & TCP_RST) {
+;
+ lda _uip_buf+33
+ and #$04
+ beq L057D
+;
+; uip_connr->tcpstateflags = UIP_CLOSED;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; uip_flags = UIP_ABORT;
+;
+ lda #$20
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; goto drop;
+;
+ jmp L01EA
+;
+; c = (BUF->tcpoffset >> 4) << 2;
+;
+L057D: tax
+ lda _uip_buf+32
+ jsr asrax4
+ asl a
+ asl a
+ sta _c
+;
+; uip_len = uip_len - c - UIP_IPH_LEN;
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr pushax
+ lda _c
+ jsr tossuba0
+ ldy #$14
+ jsr decaxy
+ sta _uip_len
+ stx _uip_len+1
+;
+; if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$0F
+ cmp #$02
+ bne L0593
+;
+; ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) {
+;
+ lda _uip_buf+33
+ and #$3F
+ cmp #$12
+ beq L058F
+L0593: lda #$00
+ jmp L059A
+L058F: lda #$01
+L059A: jsr bnega
+ jeq L058D
+;
+; if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
+;
+ lda _uip_len
+ ora _uip_len+1
+ bne L059D
+ lda _uip_buf+33
+ and #$03
+ beq L058D
+;
+; (BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
+;
+L059D: lda _uip_buf+24
+ jsr pusha0
+ ldy #$03
+ jsr ldaxysp
+ ldy #$08
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ jne L05BA
+;
+; BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
+;
+ lda _uip_buf+25
+ jsr pusha0
+ ldy #$03
+ jsr ldaxysp
+ ldy #$09
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ jne L05BA
+;
+; BUF->seqno[2] != uip_connr->rcv_nxt[2] ||
+;
+ lda _uip_buf+26
+ jsr pusha0
+ ldy #$03
+ jsr ldaxysp
+ ldy #$0A
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ jne L05BA
+;
+; BUF->seqno[3] != uip_connr->rcv_nxt[3])) {
+;
+ lda _uip_buf+27
+ jsr pusha0
+ ldy #$03
+ jsr ldaxysp
+ ldy #$0B
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr tosicmp
+ jne L05BA
+;
+; if((BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) {
+;
+L058D: lda _uip_buf+33
+ and #$10
+ jeq L05C7
+ jsr ldax0sp
+ ldy #$10
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ iny
+ ora (ptr1),y
+ jeq L05C7
+;
+; uip_add32(uip_connr->snd_nxt, uip_connr->len);
+;
+ jsr ldax0sp
+ ldy #$0C
+ jsr incaxy
+ jsr pushax
+ ldy #$03
+ jsr ldaxysp
+ ldy #$11
+ jsr pushwidx
+ jsr _uip_add32
+;
+; if(BUF->ackno[0] == uip_acc32[0] &&
+;
+ lda _uip_buf+28
+ jsr pusha0
+ lda _uip_acc32
+ jsr tosicmp
+ jne L05C7
+;
+; BUF->ackno[1] == uip_acc32[1] &&
+;
+ lda _uip_buf+29
+ jsr pusha0
+ lda _uip_acc32+1
+ jsr tosicmp
+ jne L05C7
+;
+; BUF->ackno[2] == uip_acc32[2] &&
+;
+ lda _uip_buf+30
+ jsr pusha0
+ lda _uip_acc32+2
+ jsr tosicmp
+ jne L05C7
+;
+; BUF->ackno[3] == uip_acc32[3]) {
+;
+ lda _uip_buf+31
+ jsr pusha0
+ lda _uip_acc32+3
+ jsr tosicmp
+ jne L05C7
+;
+; uip_connr->snd_nxt[0] = uip_acc32[0];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_acc32
+ ldy #$0C
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[1] = uip_acc32[1];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_acc32+1
+ ldy #$0D
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[2] = uip_acc32[2];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_acc32+2
+ ldy #$0E
+ sta (sreg),y
+;
+; uip_connr->snd_nxt[3] = uip_acc32[3];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_acc32+3
+ ldy #$0F
+ sta (sreg),y
+;
+; if(uip_connr->nrtx == 0) {
+;
+ jsr ldax0sp
+ ldy #$1B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jne L05EB
+;
+; m = uip_connr->rto - uip_connr->timer;
+;
+ jsr decsp1
+ ldy #$02
+ jsr ldaxysp
+ ldy #$18
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jsr pusha0
+ ldy #$04
+ jsr ldaxysp
+ ldy #$1A
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ jsr tossuba0
+ ldy #$00
+ sta (sp),y
+;
+; m = m - (uip_connr->sa >> 3);
+;
+ ldx #$00
+ lda (sp),y
+ bpl L05F1
+ dex
+L05F1: jsr pushax
+ ldy #$04
+ jsr ldaxysp
+ ldy #$16
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr asrax3
+ jsr tossubax
+ ldy #$00
+ sta (sp),y
+;
+; uip_connr->sa += m;
+;
+ ldy #$02
+ jsr ldaxysp
+ sta ptr2
+ stx ptr2+1
+ ldy #$16
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta sreg
+ ldy #$00
+ lda (sp),y
+ clc
+ adc sreg
+ ldy #$16
+ sta (ptr2),y
+;
+; if(m < 0) {
+;
+ ldy #$00
+ lda (sp),y
+ tax
+ bpl L05F6
+;
+; m = -m;
+;
+ ldx #$00
+ lda (sp),y
+ bpl L05FB
+ dex
+L05FB: jsr negax
+ sta (sp),y
+;
+; m = m - (uip_connr->sv >> 2);
+;
+L05F6: ldx #$00
+ lda (sp),y
+ bpl L05FE
+ dex
+L05FE: jsr pushax
+ ldy #$04
+ jsr ldaxysp
+ ldy #$17
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr asrax2
+ jsr tossubax
+ ldy #$00
+ sta (sp),y
+;
+; uip_connr->sv += m;
+;
+ ldy #$02
+ jsr ldaxysp
+ sta ptr2
+ stx ptr2+1
+ ldy #$17
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta sreg
+ ldy #$00
+ lda (sp),y
+ clc
+ adc sreg
+ ldy #$17
+ sta (ptr2),y
+;
+; uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv;
+;
+ ldy #$04
+ jsr pushwysp
+ ldy #$04
+ jsr ldaxysp
+ ldy #$16
+ sta ptr1
+ stx ptr1+1
+ ldx #$00
+ lda (ptr1),y
+ jsr asrax3
+ sta sreg
+ ldy #$04
+ jsr ldaxysp
+ ldy #$17
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ clc
+ adc sreg
+ iny
+ jsr staspidx
+;
+; }
+;
+ jsr incsp1
+;
+; uip_flags = UIP_ACKDATA;
+;
+L05EB: lda #$01
+ sta _uip_flags
+;
+; uip_connr->timer = uip_connr->rto;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ jsr ldax0sp
+ ldy #$18
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ ldy #$1A
+ sta (sreg),y
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
+;
+L05C7: jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$0F
+;
+; goto drop;
+;
+ cmp #$01
+ beq L0610
+ cmp #$02
+ beq L0624
+ cmp #$03
+ jeq L0699
+ cmp #$04
+ jeq L0746
+ cmp #$05
+ jeq L076B
+ cmp #$06
+ jeq L0784
+ cmp #$07
+ jeq L05BA
+ cmp #$08
+ jeq L073D
+ jmp L01EA
+;
+; if(uip_flags & UIP_ACKDATA) {
+;
+L0610: lda _uip_flags
+ and #$01
+ jeq L01EA
+;
+; uip_connr->tcpstateflags = UIP_ESTABLISHED;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$03
+ ldy #$19
+ sta (sreg),y
+;
+; uip_flags = UIP_CONNECTED;
+;
+ lda #$40
+ sta _uip_flags
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; if(uip_len > 0) {
+;
+ lda _uip_len
+ ora _uip_len+1
+ jeq L089D
+;
+; uip_flags |= UIP_NEWDATA;
+;
+ lda _uip_flags
+ ora #$02
+ sta _uip_flags
+;
+; uip_add_rcv_nxt(uip_len);
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr pushax
+ jsr _uip_add_rcv_nxt
+;
+; goto appsend;
+;
+ jmp L089D
+;
+; if((uip_flags & UIP_ACKDATA) &&
+;
+L0624: lda _uip_flags
+ and #$01
+ jeq L0625
+;
+; (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) {
+;
+ lda _uip_buf+33
+ and #$3F
+ cmp #$12
+ jne L0625
+;
+; if((BUF->tcpoffset & 0xf0) > 0x50) {
+;
+ lda _uip_buf+32
+ and #$F0
+ cmp #$51
+ jcc L0636
+;
+; for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
+;
+ lda #$00
+L088E: sta _c
+L0635: lda _c
+ jsr pusha0
+ lda _uip_buf+32
+ jsr asrax4
+ jsr decax5
+ jsr aslax2
+ jsr tosicmp
+ jcs L0636
+;
+; opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c];
+;
+ ldx #$00
+ lda _c
+ ldy #$28
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ sta _opt
+;
+; if(opt == TCP_OPT_END) {
+;
+ lda _opt
+;
+; break;
+;
+ jeq L0636
+;
+; } else if(opt == TCP_OPT_NOOP) {
+;
+ lda _opt
+ cmp #$01
+ bne L0647
+;
+; ++c;
+;
+ inc _c
+;
+; } else if(opt == TCP_OPT_MSS &&
+;
+ jmp L0635
+L0647: lda _opt
+ cmp #$02
+ jne L064B
+;
+; uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
+;
+ ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ cmp #$04
+ bne L064B
+;
+; tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
+;
+ ldx #$00
+ lda _c
+ ldy #$2A
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ tax
+ tya
+;
+; uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c];
+;
+ jsr pushax
+ tax
+ lda _c
+ ldy #$2B
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ ldx #$00
+ lda (ptr1),y
+ jsr tosorax
+ sta _tmp16
+ stx _tmp16+1
+;
+; uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
+;
+ jsr pushw0sp
+ ldy #$05
+ jsr pushwysp
+ lda _tmp16+1
+ cmp #$00
+ bne L065D
+ lda _tmp16
+ cmp #$79
+L065D: bcc L065E
+ ldx #$00
+ lda #$78
+ jmp L0662
+L065E: lda _tmp16
+ ldx _tmp16+1
+L0662: ldy #$12
+ jsr staxspidx
+ ldy #$14
+ jsr staxspidx
+;
+; break;
+;
+ jmp L0636
+;
+; if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
+;
+L064B: ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+;
+; break;
+;
+ beq L0636
+;
+; c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
+;
+ ldx #$00
+ lda _c
+ ldy #$29
+ jsr incaxy
+ clc
+ adc #<(_uip_buf)
+ sta ptr1
+ txa
+ adc #>(_uip_buf)
+ sta ptr1+1
+ ldy #$00
+ lda (ptr1),y
+ clc
+ adc _c
+;
+; }
+;
+ jmp L088E
+;
+; uip_connr->tcpstateflags = UIP_ESTABLISHED;
+;
+L0636: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$03
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[0] = BUF->seqno[0];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+24
+ ldy #$08
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[1] = BUF->seqno[1];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+25
+ ldy #$09
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[2] = BUF->seqno[2];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+26
+ ldy #$0A
+ sta (sreg),y
+;
+; uip_connr->rcv_nxt[3] = BUF->seqno[3];
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_buf+27
+ ldy #$0B
+ sta (sreg),y
+;
+; uip_add_rcv_nxt(1);
+;
+ jsr push1
+ jsr _uip_add_rcv_nxt
+;
+; uip_flags = UIP_CONNECTED | UIP_NEWDATA;
+;
+ lda #$42
+ sta _uip_flags
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; uip_len = 0;
+;
+ sta _uip_len
+ sta _uip_len+1
+;
+; goto appsend;
+;
+ jmp L089B
+;
+; uip_flags = UIP_ABORT;
+;
+L0625: lda #$20
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; uip_conn->tcpstateflags = UIP_CLOSED;
+;
+ lda _uip_conn
+ sta sreg
+ lda _uip_conn+1
+ sta sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; goto reset;
+;
+ jmp L03E5
+;
+; if(BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
+;
+L0699: lda _uip_buf+33
+ and #$01
+ beq L069A
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$10
+ bne L069A
+;
+; if(uip_outstanding(uip_connr)) {
+;
+ jsr ldax0sp
+ ldy #$10
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ iny
+ ora (ptr1),y
+;
+; goto drop;
+;
+ jne L01EA
+;
+; uip_add_rcv_nxt(1 + uip_len);
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr incax1
+ jsr pushax
+ jsr _uip_add_rcv_nxt
+;
+; uip_flags |= UIP_CLOSE;
+;
+ lda _uip_flags
+ ora #$10
+ sta _uip_flags
+;
+; if(uip_len > 0) {
+;
+ lda _uip_len
+ ora _uip_len+1
+ beq L06A9
+;
+; uip_flags |= UIP_NEWDATA;
+;
+ lda _uip_flags
+ ora #$02
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+L06A9: jsr _telnet_app
+;
+; uip_connr->len = 1;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$10
+ sta (sreg),y
+ iny
+ lda #$00
+ sta (sreg),y
+;
+; uip_connr->tcpstateflags = UIP_LAST_ACK;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$08
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->nrtx = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1B
+ sta (sreg),y
+;
+; BUF->flags = TCP_FIN | TCP_ACK;
+;
+L0244: lda #$11
+;
+; goto tcp_send_nodata;
+;
+ jmp L0889
+;
+; if((BUF->flags & TCP_URG) != 0) {
+;
+L069A: lda _uip_buf+33
+ and #$20
+ beq L06B9
+;
+; uip_appdata = ((char *)uip_appdata) + ((BUF->urgp[0] << 8) | BUF->urgp[1]);
+;
+ lda _uip_appdata
+ sta ptr1
+ lda _uip_appdata+1
+ sta ptr1+1
+ ldx _uip_buf+38
+ stx sreg+1
+ ldx #$00
+ lda _uip_buf+39
+ sta sreg
+ txa
+ ora sreg+1
+ tax
+ lda sreg
+ clc
+ adc ptr1
+ sta ptr1
+ txa
+ adc ptr1+1
+ tax
+ lda ptr1
+ sta _uip_appdata
+ stx _uip_appdata+1
+;
+; uip_len -= (BUF->urgp[0] << 8) | BUF->urgp[1];
+;
+ ldx _uip_buf+38
+ stx sreg+1
+ ldx #$00
+ lda _uip_buf+39
+ sta sreg
+ txa
+ ora sreg+1
+ tax
+ lda sreg
+ sec
+ eor #$FF
+ adc _uip_len
+ sta _uip_len
+ txa
+ eor #$FF
+ adc _uip_len+1
+ sta _uip_len+1
+;
+; if(uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
+;
+L06B9: lda _uip_len
+ ora _uip_len+1
+ beq L06D3
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$10
+ bne L06D3
+;
+; uip_flags |= UIP_NEWDATA;
+;
+ lda _uip_flags
+ ora #$02
+ sta _uip_flags
+;
+; uip_add_rcv_nxt(uip_len);
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr pushax
+ jsr _uip_add_rcv_nxt
+;
+; tmp16 = ((u16_t)BUF->wnd[0] << 8) + (u16_t)BUF->wnd[1];
+;
+L06D3: ldx _uip_buf+34
+ lda #$00
+ clc
+ adc _uip_buf+35
+ bcc L0880
+ inx
+L0880: sta _tmp16
+ stx _tmp16+1
+;
+; if(tmp16 > uip_connr->initialmss ||
+;
+ jsr pushax
+ ldy #$03
+ jsr ldaxysp
+ ldy #$15
+ jsr ldaxidx
+ jsr tosicmp
+ beq L0894
+ bcs L06E7
+;
+; tmp16 == 0) {
+;
+L0894: lda _tmp16
+ ora _tmp16+1
+ bne L06E6
+;
+; tmp16 = uip_connr->initialmss;
+;
+L06E7: jsr ldax0sp
+ ldy #$15
+ jsr ldaxidx
+ sta _tmp16
+ stx _tmp16+1
+;
+; uip_connr->mss = tmp16;
+;
+L06E6: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _tmp16
+ ldx _tmp16+1
+ ldy #$12
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) {
+;
+ lda _uip_flags
+ and #$03
+ jeq L01EA
+;
+; uip_slen = 0;
+;
+L089D: lda #$00
+L089B: sta _uip_slen
+ sta _uip_slen+1
+;
+; UIP_APPCALL();
+;
+L0888: jsr _telnet_app
+;
+; if(uip_flags & UIP_ABORT) {
+;
+ lda _uip_flags
+ and #$20
+ beq L06F4
+;
+; uip_slen = 0;
+;
+ lda #$00
+ sta _uip_slen
+ sta _uip_slen+1
+;
+; uip_connr->tcpstateflags = UIP_CLOSED;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; BUF->flags = TCP_RST | TCP_ACK;
+;
+ lda #$14
+;
+; goto tcp_send_nodata;
+;
+ jmp L0889
+;
+; if(uip_flags & UIP_CLOSE) {
+;
+L06F4: lda _uip_flags
+ and #$10
+ beq L06FE
+;
+; uip_slen = 0;
+;
+ lda #$00
+ sta _uip_slen
+ sta _uip_slen+1
+;
+; uip_connr->len = 1;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$01
+ ldy #$10
+ sta (sreg),y
+ iny
+ lda #$00
+ sta (sreg),y
+;
+; uip_connr->tcpstateflags = UIP_FIN_WAIT_1;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$04
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->nrtx = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1B
+ sta (sreg),y
+;
+; BUF->flags = TCP_FIN | TCP_ACK;
+;
+ lda #$11
+;
+; goto tcp_send_nodata;
+;
+ jmp L0889
+;
+; if(uip_slen > 0) {
+;
+L06FE: lda _uip_slen
+ ora _uip_slen+1
+ beq L071E
+;
+; if((uip_flags & UIP_ACKDATA) != 0) {
+;
+ lda _uip_flags
+ and #$01
+ beq L070F
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; if(uip_connr->len == 0) {
+;
+L070F: jsr ldax0sp
+ ldy #$11
+ jsr ldaxidx
+ cpx #$00
+ bne L0715
+ cmp #$00
+ bne L0715
+;
+; if(uip_slen > uip_connr->mss) {
+;
+ lda _uip_slen
+ ldx _uip_slen+1
+ jsr pushax
+ ldy #$03
+ jsr ldaxysp
+ ldy #$13
+ jsr ldaxidx
+ jsr tosicmp
+ bcc L0718
+ beq L0718
+;
+; uip_slen = uip_connr->mss;
+;
+ jsr ldax0sp
+ ldy #$13
+ jsr ldaxidx
+ sta _uip_slen
+ stx _uip_slen+1
+;
+; uip_connr->len = uip_slen;
+;
+L0718: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda _uip_slen
+ ldx _uip_slen+1
+ ldy #$10
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; } else {
+;
+ jmp L071E
+;
+; uip_slen = uip_connr->len;
+;
+L0715: jsr ldax0sp
+ ldy #$11
+ jsr ldaxidx
+ sta _uip_slen
+ stx _uip_slen+1
+;
+; uip_connr->nrtx = 0;
+;
+L071E: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1B
+ sta (sreg),y
+;
+; uip_appdata = uip_sappdata;
+;
+L023D: lda _uip_sappdata
+ sta _uip_appdata
+ lda _uip_sappdata+1
+ sta _uip_appdata+1
+;
+; if(uip_slen > 0 && uip_connr->len > 0) {
+;
+ lda _uip_slen
+ ora _uip_slen+1
+ beq L0725
+ jsr ldax0sp
+ ldy #$11
+ jsr ldaxidx
+ cpx #$00
+ bne L0726
+ cmp #$00
+ beq L0725
+;
+; uip_len = uip_connr->len + UIP_TCPIP_HLEN;
+;
+L0726: jsr ldax0sp
+ ldy #$11
+ jsr ldaxidx
+ ldy #$28
+ jsr incaxy
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->flags = TCP_ACK | TCP_PSH;
+;
+ lda #$18
+ sta _uip_buf+33
+;
+; goto tcp_send_noopts;
+;
+ jmp L0732
+;
+; if(uip_flags & UIP_NEWDATA) {
+;
+L0725: lda _uip_flags
+ and #$02
+ jeq L01EA
+;
+; uip_len = UIP_TCPIP_HLEN;
+;
+ ldx #$00
+ lda #$28
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->flags = TCP_ACK;
+;
+ lda #$10
+ sta _uip_buf+33
+;
+; goto tcp_send_noopts;
+;
+ jmp L0732
+;
+; if(uip_flags & UIP_ACKDATA) {
+;
+L073D: lda _uip_flags
+ and #$01
+ jeq L01EA
+;
+; uip_connr->tcpstateflags = UIP_CLOSED;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$19
+ sta (sreg),y
+;
+; uip_flags = UIP_CLOSE;
+;
+ lda #$10
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; break;
+;
+ jmp L01EA
+;
+; if(uip_len > 0) {
+;
+L0746: lda _uip_len
+ ora _uip_len+1
+ beq L0747
+;
+; uip_add_rcv_nxt(uip_len);
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr pushax
+ jsr _uip_add_rcv_nxt
+;
+; if(BUF->flags & TCP_FIN) {
+;
+L0747: lda _uip_buf+33
+ and #$01
+ beq L074C
+;
+; if(uip_flags & UIP_ACKDATA) {
+;
+ lda _uip_flags
+ and #$01
+ beq L0750
+;
+; uip_connr->tcpstateflags = UIP_TIME_WAIT;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$07
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->timer = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1A
+ sta (sreg),y
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+;
+; } else {
+;
+ jmp L088F
+;
+; uip_connr->tcpstateflags = UIP_CLOSING;
+;
+L0750: jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$06
+ ldy #$19
+L088F: sta (sreg),y
+;
+; uip_add_rcv_nxt(1);
+;
+ jsr push1
+ jsr _uip_add_rcv_nxt
+;
+; uip_flags = UIP_CLOSE;
+;
+ lda #$10
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; goto tcp_send_ack;
+;
+ jmp L05BA
+;
+; } else if(uip_flags & UIP_ACKDATA) {
+;
+L074C: lda _uip_flags
+ and #$01
+ beq L0761
+;
+; uip_connr->tcpstateflags = UIP_FIN_WAIT_2;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$05
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->len = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$10
+ sta (sreg),y
+ iny
+ sta (sreg),y
+;
+; goto drop;
+;
+ jmp L01EA
+;
+; if(uip_len > 0) {
+;
+L0761: lda _uip_len
+ ora _uip_len+1
+ jeq L01EA
+;
+; goto tcp_send_ack;
+;
+ jmp L05BA
+;
+; if(uip_len > 0) {
+;
+L076B: lda _uip_len
+ ora _uip_len+1
+ beq L076C
+;
+; uip_add_rcv_nxt(uip_len);
+;
+ lda _uip_len
+ ldx _uip_len+1
+ jsr pushax
+ jsr _uip_add_rcv_nxt
+;
+; if(BUF->flags & TCP_FIN) {
+;
+L076C: lda _uip_buf+33
+ and #$01
+ beq L0771
+;
+; uip_connr->tcpstateflags = UIP_TIME_WAIT;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$07
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->timer = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1A
+ sta (sreg),y
+;
+; uip_add_rcv_nxt(1);
+;
+ jsr push1
+ jsr _uip_add_rcv_nxt
+;
+; uip_flags = UIP_CLOSE;
+;
+ lda #$10
+ sta _uip_flags
+;
+; UIP_APPCALL();
+;
+ jsr _telnet_app
+;
+; goto tcp_send_ack;
+;
+ jmp L05BA
+;
+; if(uip_len > 0) {
+;
+L0771: lda _uip_len
+ ora _uip_len+1
+ jeq L01EA
+;
+; goto tcp_send_ack;
+;
+ jmp L05BA
+;
+; if(uip_flags & UIP_ACKDATA) {
+;
+L0784: lda _uip_flags
+ and #$01
+ jeq L01EA
+;
+; uip_connr->tcpstateflags = UIP_TIME_WAIT;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$07
+ ldy #$19
+ sta (sreg),y
+;
+; uip_connr->timer = 0;
+;
+ jsr ldax0sp
+ sta sreg
+ stx sreg+1
+ lda #$00
+ ldy #$1A
+ sta (sreg),y
+;
+; goto drop;
+;
+ jmp L01EA
+;
+; BUF->flags = TCP_ACK;
+;
+L05BA: lda #$10
+L0889: sta _uip_buf+33
+;
+; uip_len = UIP_IPTCPH_LEN;
+;
+ ldx #$00
+ lda #$28
+ sta _uip_len
+ stx _uip_len+1
+;
+; BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4;
+;
+L0732: lda #$50
+L088D: sta _uip_buf+32
+;
+; BUF->ackno[0] = uip_connr->rcv_nxt[0];
+;
+ jsr ldax0sp
+ ldy #$08
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+28
+;
+; BUF->ackno[1] = uip_connr->rcv_nxt[1];
+;
+ jsr ldax0sp
+ ldy #$09
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+29
+;
+; BUF->ackno[2] = uip_connr->rcv_nxt[2];
+;
+ jsr ldax0sp
+ ldy #$0A
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+30
+;
+; BUF->ackno[3] = uip_connr->rcv_nxt[3];
+;
+ jsr ldax0sp
+ ldy #$0B
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+31
+;
+; BUF->seqno[0] = uip_connr->snd_nxt[0];
+;
+ jsr ldax0sp
+ ldy #$0C
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+24
+;
+; BUF->seqno[1] = uip_connr->snd_nxt[1];
+;
+ jsr ldax0sp
+ ldy #$0D
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+25
+;
+; BUF->seqno[2] = uip_connr->snd_nxt[2];
+;
+ jsr ldax0sp
+ ldy #$0E
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+26
+;
+; BUF->seqno[3] = uip_connr->snd_nxt[3];
+;
+ jsr ldax0sp
+ ldy #$0F
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_buf+27
+;
+; BUF->proto = UIP_PROTO_TCP;
+;
+ lda #$06
+ sta _uip_buf+9
+;
+; BUF->srcport = uip_connr->lport;
+;
+ jsr ldax0sp
+ ldy #$05
+ jsr ldaxidx
+ sta _uip_buf+20
+ stx _uip_buf+20+1
+;
+; BUF->destport = uip_connr->rport;
+;
+ jsr ldax0sp
+ ldy #$07
+ jsr ldaxidx
+ sta _uip_buf+22
+ stx _uip_buf+22+1
+;
+; uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+;
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+12)
+ sta sreg
+ lda #>(_uip_buf+12)
+ sta sreg+1
+ lda #<(_uip_hostaddr)
+ ldx #>(_uip_hostaddr)
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; uip_ipaddr_copy(BUF->destipaddr, uip_connr->ripaddr);
+;
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ jsr ldax0sp
+ jsr ldaxi
+ ldy #$00
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+ lda #<(_uip_buf+16)
+ sta sreg
+ lda #>(_uip_buf+16)
+ sta sreg+1
+ jsr ldax0sp
+ ldy #$03
+ jsr ldaxidx
+ ldy #$02
+ sta (sreg),y
+ iny
+ txa
+ sta (sreg),y
+;
+; if(uip_connr->tcpstateflags & UIP_STOPPED) {
+;
+ jsr ldax0sp
+ ldy #$19
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ and #$10
+ beq L07FB
+;
+; BUF->wnd[0] = BUF->wnd[1] = 0;
+;
+ lda #$00
+ sta _uip_buf+35
+ sta _uip_buf+34
+;
+; } else {
+;
+ jmp L049A
+;
+; BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8);
+;
+L07FB: sta _uip_buf+34
+;
+; BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff);
+;
+ lda #$78
+ sta _uip_buf+35
+;
+; BUF->ttl = UIP_TTL;
+;
+L049A: lda #$40
+ sta _uip_buf+8
+;
+; BUF->len[0] = (uip_len >> 8);
+;
+ lda _uip_len+1
+ sta _uip_buf+2
+;
+; BUF->len[1] = (uip_len & 0xff);
+;
+ lda _uip_len
+ sta _uip_buf+3
+;
+; BUF->urgp[0] = BUF->urgp[1] = 0;
+;
+ lda #$00
+ sta _uip_buf+39
+ sta _uip_buf+38
+;
+; BUF->tcpchksum = 0;
+;
+ sta _uip_buf+36
+ sta _uip_buf+36+1
+;
+; BUF->tcpchksum = ~(uip_tcpchksum());
+;
+ jsr _uip_tcpchksum
+ jsr complax
+ sta _uip_buf+36
+ stx _uip_buf+36+1
+;
+; BUF->vhl = 0x45;
+;
+L03B9: lda #$45
+ sta _uip_buf
+;
+; BUF->tos = 0;
+;
+ lda #$00
+ sta _uip_buf+1
+;
+; BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
+;
+ sta _uip_buf+7
+ sta _uip_buf+6
+;
+; ++ipid;
+;
+ inc _ipid
+ bne L084D
+ inc _ipid+1
+;
+; BUF->ipid[0] = ipid >> 8;
+;
+L084D: lda _ipid+1
+ sta _uip_buf+4
+;
+; BUF->ipid[1] = ipid & 0xff;
+;
+ lda _ipid
+ sta _uip_buf+5
+;
+; BUF->ipchksum = 0;
+;
+ lda #$00
+ sta _uip_buf+10
+ sta _uip_buf+10+1
+;
+; BUF->ipchksum = ~(uip_ipchksum());
+;
+ jsr _uip_ipchksum
+ jsr complax
+ sta _uip_buf+10
+ stx _uip_buf+10+1
+;
+; uip_flags = 0;
+;
+L030D: lda #$00
+;
+; return;
+;
+ jmp L0890
+;
+; uip_len = 0;
+;
+L01EA: lda #$00
+ sta _uip_len
+ sta _uip_len+1
+;
+; uip_flags = 0;
+;
+L0890: sta _uip_flags
+;
+; }
+;
+ jmp incsp3
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ uip_chksum (__near__ unsigned int*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_chksum: near
+
+.segment "CODE"
+
+;
+; return htons(chksum(0, (u8_t *)data, len));
+;
+ jsr push0
+ ldy #$07
+ jsr pushwysp
+ ldy #$07
+ jsr pushwysp
+ jsr _chksum
+ jsr pushax
+ jsr _htons
+;
+; }
+;
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ uip_ipchksum (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_ipchksum: near
+
+.segment "CODE"
+
+;
+; sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
+;
+ jsr decsp2
+ jsr push0
+ lda #<(_uip_buf)
+ ldx #>(_uip_buf)
+ jsr pushax
+ lda #$14
+ jsr pusha0
+ jsr _chksum
+ jsr stax0sp
+;
+; return (sum == 0) ? 0xffff : htons(sum);
+;
+ cpx #$00
+ bne L0090
+ cmp #$00
+ bne L0090
+ dex
+ txa
+ jmp incsp2
+L0090: jsr pushw0sp
+ jsr _htons
+ jmp incsp2
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ uip_tcpchksum (void)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_tcpchksum: near
+
+.segment "CODE"
+
+;
+; return upper_layer_chksum(UIP_PROTO_TCP);
+;
+ lda #$06
+ jsr pusha
+ jmp _upper_layer_chksum
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_add32 (__near__ unsigned char*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_add32: near
+
+.segment "CODE"
+
+;
+; uip_acc32[3] = op32[3] + (op16 & 0xff);
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$03
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta sreg
+ ldy #$00
+ lda (sp),y
+ clc
+ adc sreg
+ sta _uip_acc32+3
+;
+; uip_acc32[2] = op32[2] + (op16 >> 8);
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$02
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta sreg
+ dey
+ lda (sp),y
+ clc
+ adc sreg
+ sta _uip_acc32+2
+;
+; uip_acc32[1] = op32[1];
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$01
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_acc32+1
+;
+; uip_acc32[0] = op32[0];
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ sta _uip_acc32
+;
+; if(uip_acc32[2] < (op16 >> 8)) {
+;
+ lda _uip_acc32+2
+ jsr pusha0
+ ldy #$03
+ lda (sp),y
+ jsr tosicmp
+ bcs L0045
+;
+; ++uip_acc32[1];
+;
+ inc _uip_acc32+1
+;
+; if(uip_acc32[1] == 0) {
+;
+ lda _uip_acc32+1
+ bne L0045
+;
+; ++uip_acc32[0];
+;
+ inc _uip_acc32
+;
+; if(uip_acc32[3] < (op16 & 0xff)) {
+;
+L0045: lda _uip_acc32+3
+ jsr pusha0
+ ldy #$02
+ lda (sp),y
+ jsr tosicmp
+ jcs incsp4
+;
+; ++uip_acc32[2];
+;
+ inc _uip_acc32+2
+;
+; if(uip_acc32[2] == 0) {
+;
+ lda _uip_acc32+2
+ jne incsp4
+;
+; ++uip_acc32[1];
+;
+ inc _uip_acc32+1
+;
+; if(uip_acc32[1] == 0) {
+;
+ lda _uip_acc32+1
+ jne incsp4
+;
+; ++uip_acc32[0];
+;
+ inc _uip_acc32
+;
+; }
+;
+ jmp incsp4
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ chksum (unsigned int, __near__ const unsigned char*, unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _chksum: near
+
+.segment "CODE"
+
+;
+; dataptr = data;
+;
+ jsr decsp6
+ ldy #$09
+ jsr ldaxysp
+ ldy #$02
+ jsr staxysp
+;
+; last_byte = data + len - 1;
+;
+ ldy #$09
+ jsr ldaxysp
+ sta sreg
+ stx sreg+1
+ ldy #$07
+ jsr ldaxysp
+ clc
+ adc sreg
+ sta sreg
+ txa
+ adc sreg+1
+ tax
+ lda sreg
+ jsr decax1
+ jsr stax0sp
+;
+; while(dataptr < last_byte) { /* At least two more bytes */
+;
+L0065: ldy #$05
+ jsr pushwysp
+ ldy #$03
+ jsr ldaxysp
+ jsr tosicmp
+ bcs L0066
+;
+; t = (dataptr[0] << 8) + dataptr[1];
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ tax
+ stx sreg+1
+ ldy #$03
+ jsr ldaxysp
+ ldy #$01
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ clc
+ adc #$00
+ ldx sreg+1
+ bcc L08A2
+ inx
+L08A2: ldy #$04
+ jsr staxysp
+;
+; sum += t;
+;
+ ldy #$0A
+ jsr addeqysp
+;
+; if(sum < t) {
+;
+ ldy #$0D
+ jsr pushwysp
+ ldy #$07
+ jsr ldaxysp
+ jsr tosicmp
+ bcs L006F
+;
+; sum++; /* carry */
+;
+ ldy #$0B
+ jsr ldaxysp
+ jsr incax1
+ ldy #$0A
+ jsr staxysp
+;
+; dataptr += 2;
+;
+L006F: ldy #$02
+ ldx #$00
+ tya
+ jsr addeqysp
+;
+; }
+;
+ jmp L0065
+;
+; if(dataptr == last_byte) {
+;
+L0066: ldy #$05
+ jsr pushwysp
+ ldy #$03
+ jsr ldaxysp
+ jsr tosicmp
+ bne L007C
+;
+; t = (dataptr[0] << 8) + 0;
+;
+ ldy #$03
+ jsr ldaxysp
+ ldy #$00
+ sta ptr1
+ stx ptr1+1
+ lda (ptr1),y
+ tax
+ tya
+ ldy #$04
+ jsr staxysp
+;
+; sum += t;
+;
+ ldy #$0A
+ jsr addeqysp
+;
+; if(sum < t) {
+;
+ ldy #$0D
+ jsr pushwysp
+ ldy #$07
+ jsr ldaxysp
+ jsr tosicmp
+ bcs L007C
+;
+; sum++; /* carry */
+;
+ ldy #$0B
+ jsr ldaxysp
+ jsr incax1
+ ldy #$0A
+ jsr staxysp
+;
+; return sum;
+;
+L007C: ldy #$0B
+ jsr ldaxysp
+;
+; }
+;
+ ldy #$0C
+ jmp addysp
+
+.endproc
+
+; ---------------------------------------------------------------
+; unsigned int __near__ upper_layer_chksum (unsigned char)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _upper_layer_chksum: near
+
+.segment "CODE"
+
+;
+; upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
+;
+ jsr decsp4
+ ldx _uip_buf+2
+ lda #$00
+ clc
+ adc _uip_buf+3
+ bcc L08A3
+ inx
+L08A3: ldy #$14
+ jsr decaxy
+ ldy #$02
+ jsr staxysp
+;
+; sum = upper_layer_len + proto;
+;
+ sta sreg
+ stx sreg+1
+ ldy #$04
+ lda (sp),y
+ clc
+ adc sreg
+ ldx sreg+1
+ bcc L08A4
+ inx
+L08A4: jsr stax0sp
+;
+; sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
+;
+ jsr pushax
+ lda #<(_uip_buf+12)
+ ldx #>(_uip_buf+12)
+ jsr pushax
+ lda #$08
+ jsr pusha0
+ jsr _chksum
+ jsr stax0sp
+;
+; sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN],
+;
+ jsr pushax
+ lda #<(_uip_buf+20)
+ ldx #>(_uip_buf+20)
+ jsr pushax
+;
+; upper_layer_len);
+;
+ ldy #$09
+ jsr pushwysp
+ jsr _chksum
+ jsr stax0sp
+;
+; return (sum == 0) ? 0xffff : htons(sum);
+;
+ cpx #$00
+ bne L00B5
+ cmp #$00
+ bne L00B5
+ dex
+ txa
+ jmp incsp5
+L00B5: jsr pushw0sp
+ jsr _htons
+ jmp incsp5
+
+.endproc
+
+; ---------------------------------------------------------------
+; void __near__ uip_add_rcv_nxt (unsigned int)
+; ---------------------------------------------------------------
+
+.segment "CODE"
+
+.proc _uip_add_rcv_nxt: near
+
+.segment "CODE"
+
+;
+; uip_add32(uip_conn->rcv_nxt, n);
+;
+ lda _uip_conn
+ ldx _uip_conn+1
+ jsr incax8
+ jsr pushax
+ ldy #$05
+ jsr pushwysp
+ jsr _uip_add32
+;
+; uip_conn->rcv_nxt[0] = uip_acc32[0];
+;
+ lda _uip_conn
+ sta sreg
+ lda _uip_conn+1
+ sta sreg+1
+ lda _uip_acc32
+ ldy #$08
+ sta (sreg),y
+;
+; uip_conn->rcv_nxt[1] = uip_acc32[1];
+;
+ lda _uip_conn
+ sta sreg
+ lda _uip_conn+1
+ sta sreg+1
+ lda _uip_acc32+1
+ iny
+ sta (sreg),y
+;
+; uip_conn->rcv_nxt[2] = uip_acc32[2];
+;
+ lda _uip_conn
+ sta sreg
+ lda _uip_conn+1
+ sta sreg+1
+ lda _uip_acc32+2
+ iny
+ sta (sreg),y
+;
+; uip_conn->rcv_nxt[3] = uip_acc32[3];
+;
+ lda _uip_conn
+ sta sreg
+ lda _uip_conn+1
+ sta sreg+1
+ lda _uip_acc32+3
+ iny
+ sta (sreg),y
+;
+; }
+;
+ jmp incsp2
+
+.endproc
+