diff options
author | B. Watson <yalhcru@gmail.com> | 2019-03-13 02:50:42 -0400 |
---|---|---|
committer | B. Watson <yalhcru@gmail.com> | 2019-03-13 02:50:42 -0400 |
commit | 2973d0c78e9b8eed3c5af239927c6bd36af64604 (patch) | |
tree | a0fdfe7201303edd11c6d86015ef4f79796fcf0f /src | |
download | fujichat-2973d0c78e9b8eed3c5af239927c6bd36af64604.tar.gz |
initial commit
Diffstat (limited to 'src')
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 Binary files differnew file mode 100644 index 0000000..57eee3f --- /dev/null +++ b/src/atari850.ser 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 Binary files differnew file mode 100644 index 0000000..b5aeccc --- /dev/null +++ b/src/bobvert.com diff --git a/src/clear_rts b/src/clear_rts Binary files differnew file mode 100755 index 0000000..e855ca0 --- /dev/null +++ b/src/clear_rts 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 Binary files differnew file mode 100644 index 0000000..956e404 --- /dev/null +++ b/src/col64/autorun.sys diff --git a/src/col64/col64.bin b/src/col64/col64.bin Binary files differnew file mode 100644 index 0000000..956e404 --- /dev/null +++ b/src/col64/col64.bin 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 Binary files differnew file mode 100644 index 0000000..5e5cd5a --- /dev/null +++ b/src/col64/test.atr 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 Binary files differnew file mode 100644 index 0000000..bb432dd --- /dev/null +++ b/src/col80_modified/autorun.sys 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 Binary files differnew file mode 100644 index 0000000..73ac7e3 --- /dev/null +++ b/src/col80_modified/col80_hacked.xex 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 Binary files differnew file mode 100644 index 0000000..e62d76d --- /dev/null +++ b/src/col80_modified/cruft/autorun.sys 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 Binary files differnew file mode 100644 index 0000000..5872c7f --- /dev/null +++ b/src/col80_modified/cruft/col80.xex 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 Binary files differnew file mode 100644 index 0000000..90208c3 --- /dev/null +++ b/src/col80_modified/cruft/col80_main.xex diff --git a/src/col80_modified/cruft/col80_orig.xex b/src/col80_modified/cruft/col80_orig.xex Binary files differnew file mode 100644 index 0000000..f5f9548 --- /dev/null +++ b/src/col80_modified/cruft/col80_orig.xex 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 Binary files differnew file mode 100755 index 0000000..8016b73 --- /dev/null +++ b/src/col80_modified/cruft/dos_20s.atr diff --git a/src/col80_modified/cruft/font.bin b/src/col80_modified/cruft/font.bin Binary files differnew file mode 100644 index 0000000..d2fd3d4 --- /dev/null +++ b/src/col80_modified/cruft/font.bin 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 Binary files differnew file mode 100755 index 0000000..0127b33 --- /dev/null +++ b/src/col80_modified/cruft/test.atr 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 Binary files differnew file mode 100755 index 0000000..8016b73 --- /dev/null +++ b/src/col80_modified/dos_20s.atr 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 Binary files differnew file mode 100644 index 0000000..2b599b8 --- /dev/null +++ b/src/col80_modified/icet_packed.fnt diff --git a/src/col80_modified/icet_to_col80 b/src/col80_modified/icet_to_col80 Binary files differnew file mode 100755 index 0000000..9dac02c --- /dev/null +++ b/src/col80_modified/icet_to_col80 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 Binary files differnew file mode 100644 index 0000000..7c29cd1 --- /dev/null +++ b/src/col80_modified/icet_vt.fnt diff --git a/src/col80_modified/icetmod.raw b/src/col80_modified/icetmod.raw Binary files differnew file mode 100644 index 0000000..59e1331 --- /dev/null +++ b/src/col80_modified/icetmod.raw 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 Binary files differnew file mode 100755 index 0000000..57b2d13 --- /dev/null +++ b/src/col80_modified/test.atr 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 Binary files differnew file mode 100644 index 0000000..a032ec9 --- /dev/null +++ b/src/dos25_4drives.atr diff --git a/src/dos_20s.atr b/src/dos_20s.atr Binary files differnew file mode 100644 index 0000000..8016b73 --- /dev/null +++ b/src/dos_20s.atr 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 Binary files differnew file mode 100644 index 0000000..f77c6dd --- /dev/null +++ b/src/fuji6432.atr diff --git a/src/fuji80.atr b/src/fuji80.atr Binary files differnew file mode 100644 index 0000000..d8757ba --- /dev/null +++ b/src/fuji80.atr 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 Binary files differnew file mode 100644 index 0000000..47f16d0 --- /dev/null +++ b/src/fujichat-0.1.atr diff --git a/src/fujichat-0.3.atr b/src/fujichat-0.3.atr Binary files differnew file mode 100644 index 0000000..95c2f70 --- /dev/null +++ b/src/fujichat-0.3.atr diff --git a/src/fujichat.atr b/src/fujichat.atr Binary files differnew file mode 100644 index 0000000..613a085 --- /dev/null +++ b/src/fujichat.atr diff --git a/src/fujichat.atr.ok b/src/fujichat.atr.ok Binary files differnew file mode 100644 index 0000000..b1f8912 --- /dev/null +++ b/src/fujichat.atr.ok 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 Binary files differnew file mode 100644 index 0000000..974f49e --- /dev/null +++ b/src/fujichat.cfg 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 Binary files differnew file mode 100644 index 0000000..7157856 --- /dev/null +++ b/src/fujitest.atr 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 Binary files differnew file mode 100644 index 0000000..8332d4e --- /dev/null +++ b/src/prconn.ser 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 Binary files differnew file mode 100644 index 0000000..b5aeccc --- /dev/null +++ b/src/rvert.com 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 Binary files differnew file mode 100644 index 0000000..67e0b78 --- /dev/null +++ b/src/test.atr 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 + |